コアダンプを使用して問題を診断する方法は?

コアダンプを使用して問題を診断する方法は?

次のコアダンプがあります。

pth_signal.pthread_kill(??, ??) at 0xd0124734
pth_signal._p_raise(??) at 0xd01241a4
raise.raise(??) at 0xd038acd0
abort.abort() at 0xd03eeb78
_ZN10__cxxabiv111__terminateEPFvvE(handler = ??), line 47 in "eh_terminate.cc"
_ZSt9terminatev(), line 57 in "eh_terminate.cc"
__cxa_throw(obj = ??, tinfo = ??, dest = ??), line 77 in "eh_throw.cc"
unnamed block in _Znwm(sz = 4048060128), line 54 in "new_op.cc"
unnamed block in _Znwm(sz = 4048060128), line 54 in "new_op.cc"
unnamed block in _Znwm(sz = 4048060128), line 54 in "new_op.cc"
_Znwm(sz = 4048060128), line 54 in "new_op.cc"
_Znam(sz = ??), line 36 in "new_opv.cc"
_ZN7PROFILEC1ERK6STRING(this = @0x2fe74398, iniFilename = @0x21973300), line 99 in "profile.cpp"
_ZN2IE17AppendToBDataListEP10BASKETDATA(this = @0x2130eb38, bd = 0x2fe7f000), line 2451 in "ie.cpp"
_ZN5DIEGO14HandleResponseEP10BASKETDATAPv(this = 0x2130eb38, bd = 0x2fe7f000, args = 0x2fe71d78), line 513 in "diegoclass.cpp"
_ZThn68_N5DIEGO14HandleResponseEP10BASKETDATAPv(0x2130eb7c, 0x2fe7f000, 0x2fe71d78), line 21 in "diegoclass.h"
_ZN8KOBJBASE8dispatchEiP10BASKETDATAPv(this = 0x2130eb7c, fcnidx = 12, bd = 0x2fe7f000, args = 0x2fe71d78), line 67 in "kobjbase.cpp"
_ZN6KERNEL8DispatchEPcS0_iP10BASKETDATAPvR4LISTI8KOBJBASEE(this = @0x2fe71d38, module = "diego", method = "HandleResponse", fcn_idx = 12, bd = 0x2fe7f000, args = 0x2fe71d78, thread_objects = @0xf156dd58), line 1118 in "skernel.cpp"
unnamed block in _ZN6KERNEL9ExecuteTXEP10BASKETDATA(this = @0x2fe71d38, bd = 0x2fe7f000), line 224 in "txthread.cpp"
unnamed block in _ZN6KERNEL9ExecuteTXEP10BASKETDATA(this = @0x2fe71d38, bd = 0x2fe7f000), line 224 in "txthread.cpp"
_ZN6KERNEL9ExecuteTXEP10BASKETDATA(this = @0x2fe71d38, bd = 0x2fe7f000), line 224 in "txthread.cpp"
unnamed block in _ZN6KERNEL22ProcessEnqueuedBasketsEP6BASKET(this = @0x2fe71d38, b = @0x2fe7ef68), line 1162 in "skernel.cpp"

コアダンプを使用して現在発生している競合を解決するにはどうすればよいですか?

ベストアンサー1

まず、出力を実行してc++filtC ++シンボルを人間が読み取ることができ、ソースコードの相互参照が可能な出力に分割します。

new[]ここでPROFILEコンストラクタが呼び出され、ハンドラ(std :: terminate呼び出し)なしで例外が発生し、プログラムが中断され、コアダンプが生成されることがわかります。

呼び出しをブロックnew[]にラップして、try...catch例外が何であるかを確認できます。new[]どのような状況でどの例外が発生するのか覚えていませんが、new失敗の理由の1つは通常、割り当て範囲またはdoubleの境界を上書きするためのヒープ破損ですdelete

valgrind(無料)または(商用、まだ存在すると仮定 - 15年前に最後に使用された)purifyなどのプログラムを使用して、これらのメモリエラーを診断できます。valgrindこれは良いスタートになり、上記の表の記憶が間違っているかどうかを教えてくれます。

プログラムがクラッシュすると、より深く入り、コアダンプを使用してgdbメモリイメージを調べることができますが、ここでは実際に役立つ人はいません。コードの構造とそれに関連して予想されるメモリレイアウトを知る必要があります。

おすすめ記事