使用gdb调试:为什么这个=0x0?

使用gdb调试:为什么这个=0x0?,gdb,Gdb,我正在使用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_spontan

我正在使用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出现在标有(-->)的行中:

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

(gdb) print pCallStub
    $1 = (globalCallStubClass *) 0x7a1da8
但是,
这个
(应该是
pCallStub
)仍然是
0x0

(gdb) print this
    $2 = (globalCallStubClass * const) 0x0
有人能帮我吗

谢谢,
Geta

pCallStub
0x0
,因此它指向
NULL
。在使用指针之前,必须使用
pCallStub=new globalCallStubClass()
或类似
pCallStub=createGlobalCallStubClass()
的创建者函数实例化对象

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

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

由于您有多个线程,因此可能会出现“多线程单实例问题”,即一个线程正在单实例中分配和存储,但其他线程尚未看到它


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

但是,这就是问题所在,pCallStub已实例化且不为NULL:(gdb)print pCallStub$1=(globalCallStubClass*)0x1B61720
pCallStub
是如何实例化的?它是在不同的线程中实例化的吗?是的,它是在不同的线程中实例化的,如下所示:pCallStub=new globalCallStubClass(每个调用进程的最大值,有效位);但是在我想调用该方法的时候,对象已经实例化了。编辑似乎是一个同步问题:当您在第二个线程中使用
pCallStub->addCallContext();
时,pCallStub没有正确的值。请尝试将
volatile
添加到
pCallStub
并在不进行任何优化的情况下编译。
(gdb) print pCallStub
$1 = (globalCallStubClass *) **0x7a1da8**

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