4

我正在使用 gdb 来调试程序。我看到的有点奇怪:

(gdb) bt

0xb59656f8 in globalCallStubClass::addCallContext (**this=0x0**)
    at /ccase_enodeb/callp/build_callp/src/test/framework/shared/src/shared_call_context.cc:1962

0xb5b52e64 in rrcStubClass::process_scenario_spontaneous_trigger_RRC_CONNECTION_REQUEST (gcppMsgCtx=...)
    at /ccase_enodeb/callp/build_callp/src/test/framework/rrc/src/rrc_connection_request.cc:90

0xb6c3be4c in Gcpp::routeMessage (this=0xb392e9d0) at /ccase_enodeb/callp/build_callp/src/callp_services/gcpp/src/gcpp.cc:1095

0xb6c3b3b0 in Gcpp::loop (this=0xb392e9d0, Default_Method_Ptr=0)
    at /ccase_enodeb/callp/build_callp/src/callp_services/gcpp/src/gcpp.cc:925

0xb58d2ae0 in stubBthdEntryPoint () at /ccase_enodeb/callp/build_callp/src/test/framework/root/src/stub_root.cc:314

0x000191f8 in lxb_thd_entry (pCtx=0x68c0f8) at /vobs/onepltf/ltefdd/core/src/lxbase/lxbase.c:3289

0xb575602e in start_thread () from /lib/arm-linux-gnueabi/libpthread.so.0

0xb56d6ab8 in ?? () from /lib/arm-linux-gnueabi/libc.so.6

0xb56d6ab8 in ?? () from /lib/arm-linux-gnueabi/libc.so.6
Backtrace stopped: previous frame identical to this frame (corrupt stack?)

(gdb) print pCallStub
$1 = (globalCallStubClass *) **0x7a1da8**

(gdb) print this
$2 = (globalCallStubClass * const) **0x0**

chrash 出现在标有 (-->) 的行处:

if (pCallStub != NULL) {

-->callStubClass* pCallInst =  pCallStub->addCallContext();

}

addCallContext为对象调用函数pCallStubpCallStub已实例化但未实例化NULL)。当我打印时pCallStub,我可以看到它有一个地址:

(gdb) print pCallStub
    $1 = (globalCallStubClass *) 0x7a1da8

但是,this(应该是pCallStub)是0x0

(gdb) print this
    $2 = (globalCallStubClass * const) 0x0

谁能帮我?

谢谢, 盖塔

4

2 回答 2

0

pCallStub0x0,所以它指向NULL。在使用指针之前,您必须使用pCallStub = new globalCallStubClass()或创建者函数来实例化对象。pCallStub = createGlobalCallStubClass()

于 2012-07-25T11:06:44.187 回答
0
(gdb) print pCallStub
$1 = (globalCallStubClass *) **0x7a1da8**

(gdb) print this
$2 = (globalCallStubClass * const) **0x0**

您需要显示更多代码以便我们了解您的问题。这里没有上下文我们可以看到 this == pCallStub 另外,如果您打开了优化,您可能看不到您认为您看到的内容(例如编译器优化了函数调用和堆栈,因此 gdb 不会报告正确的变量,因为它在堆栈中搜索它。通常,在 x86 系统上,您会在 ecx 寄存器中找到“this”。

由于您有多个线程,您可能会遇到“多线程单例问题”,即一个线程在单例实例中分配和存储,但其他线程还没有看到它。

例如,尝试使用原子比较和交换来设置单例实例。

于 2012-10-02T08:16:32.030 回答