从C调用C ++函数时崩溃

问题描述 投票:0回答:1

我有一个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版本:崩溃发生

操作系统:Centos 7,C ++:g ++ 4.8.5

Ubuntu版本:崩溃不会发生。

OS的Ubuntu 16.04,100 ++ G ++ 5.4.0

不确定它是否重要但我在两个操作系统上的docker容器中运行我的应用程序。

c++ c ubuntu centos7 g++4.8
1个回答
0
投票

事实证明,我的c ++和C库正在使用不同的#defines进行编译,因此,两个库中的C数据结构都不同。这导致c ++端的访问错位。这个问题也可能发生在两个c库中。

感谢所有回复的人。

© www.soinside.com 2019 - 2024. All rights reserved.