我有一个C ++库函数,我从C函数调用它。该调用传递一个由C ++代码访问的C数据结构。访问C数据结构时,我的程序在C ++代码中崩溃。我已按照C++ faq中有关混合C-to-C ++的所有说明进行操作。
崩溃发生在centos7机器上。在调试模式下运行相同的代码不会导致崩溃。在Ubuntu(16.04)上运行的相同代码不会导致崩溃。这是GDB对崩溃的分析。
(gdb) frame 5
#5 0x00007fc28e79226e in ngx_http_setup_handler (r=0x2469040)
at /opt/platform/nginx-noname-module.c:201
201 return ModProcessGetApi(r);
(gdb) p r->unparsed_uri
$1 = {len = 15, data = 0x24572c4 "/__xx/stats/all HTTP/1.1\r\nUser-Agent"}
(gdb) down
#4 0x00007fc28e7945b4 in ModProcessGetApi (r=r@entry=0x2469040)
at /opt/platform/nginx-body-handler.cc:274
274 ss_rval_t rv = ProcessGetRequest(r, data, &dsize);
(gdb) p r->unparsed_uri
$2 = {len = 38105792, data = 0xf <Address 0xf out of bounds>}
(gdb)
一旦执行进入C ++代码,C数据结构就会显示超出范围的地址。这里是c-to-c ++函数的粘合代码。
#if __cplusplus
extern "C" {
#endif
#include <nginx.h>
#include <ngx_core.h>
#include <ngx_log.h>
#include <ngx_http.h>
ngx_int_t ModPostRequestBodyHandler(ngx_http_request_t *r);
ngx_int_t ModProcessGetApi(ngx_http_request_t* r);
#if __cplusplus
}
#endif
如果有人能够对此有所了解,我将不胜感激。在混合使用C和C ++代码时,是否需要使用任何编译器选项,以便C ++代码可以正确访问C数据结构?这是操作系统和编译器信息:
Centos版本:发生崩溃
OS:Centos 7,C ++:g ++ 4.8.5
Ubuntu版本:崩溃不会发生。
OS:Ubuntu 16.04,C ++:g ++ 5.4.0
不确定是否重要,但我在两个操作系统上的docker容器中运行我的应用程序。
答案 0 :(得分:0)
事实证明我的c ++和C库是用不同的#defines编译的,因此,两个库中的C数据结构都不同。这导致c ++端的访问错位。这个问题也可能发生在两个c库中。
感谢所有回复的人。