使用gdb进行调试:为什么this=0x0?

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**

出现故障的位置在标记为(-->)的行:
if (pCallStub != NULL) {

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

}

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

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

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

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

有人可以帮助我吗?

谢谢, Geta

2个回答

0

pCallStub 的值是 0x0,因此它指向了 NULL。在使用该指针之前,您必须实例化一个对象并将其赋值给 pCallStub = new globalCallStubClass() 或者使用类似 pCallStub = createGlobalCallStubClass() 的创建函数。


但是,这就是问题所在,pCallStub已经被实例化并且不为NULL:(gdb)打印pCallStub $1 = (globalCallStubClass *) 0x1b61720 - Giura Geta
pCallStub 是如何实例化的?它是在不同的线程中实例化的吗? - Alessandro Pezzato
是的,它在不同的线程中实例化,像这样:pCallStub = new globalCallStubClass(MAX_UE_PER_CALLP_PROCESS, UE_CTX_VALIDITY_BITS); 但当我想调用该方法时,对象已经被实例化了。 - Giura Geta
1
似乎是同步问题:当您在第二个线程中使用pCallStub->addCallContext();时,pCallStub没有正确的值。尝试将volatile添加到pCallStub并且不进行任何优化编译。 - Alessandro Pezzato

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

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

你需要展示更多的代码让我们理解你的问题。 在这里没有上下文,我们无法看到 where this == pCallStub 的地方。 另外,如果你开启了优化,你可能看不到你认为你看到的东西(比如编译器优化了函数调用和堆栈,所以gdb不能正确报告变量,因为它在堆栈上搜索。通常,在x86系统上,你会在ecx寄存器中找到"this")。
由于你有多个线程,你可能会遇到“多线程单例问题”,即一个线程正在分配并存储单例实例,但其他线程还没有看到它。
尝试使用原子比较和交换来设置单例实例。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接