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();

}

オブジェクトに対して関数addCallContextが呼び出されましたpCallStub(pCallStubはインスタンス化されていて、 ではありませんNULL)。印刷するpCallStubと、アドレスがあることがわかります。

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

しかし、それでも、this(あるはずですpCallStub)は0x0次のとおりです。

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

誰でも私を助けることができますか?

ありがとう、ゲタ

4

2 に答える 2

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

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

問題を理解するには、より多くのコードを表示する必要があります。ここには、this == pCallStubがどこにあるかを確認できるコンテキストはありません。また、最適化をオンにしている場合は、表示していると思うものが表示されない可能性があります(コンパイラが関数呼び出しとスタックを最適化したため、gdbは表示されません)スタック上で検索するため、適切な変数を報告します。通常、x86システムでは、ecxレジスタに「this」があります。

複数のスレッドがあるため、「マルチスレッドシングルトンの問題」が発生する可能性があります。つまり、1つのスレッドがシングルトンインスタンスに割り当てて格納していますが、他のスレッドはまだそれを認識していません。

たとえば、アトミックコンペアアンドスワップを使用してシングルトンインスタンスを設定してみてください。

于 2012-10-02T08:16:32.030 に答える
0

pCallStubです0x0ので、 を指していNULLます。ポインターを使用する前のpCallStub = new globalCallStubClass()ように、またはクリエーター関数を使用してオブジェクトをインスタンス化する必要があります。pCallStub = createGlobalCallStubClass()

于 2012-07-25T11:06:44.187 に答える