1

1つのコアダンプをデバッグしようとしていますが、構造を見つけました。最初の変数は、0x00000055558.. 入力すると次x 0x00000055558..のようになります。

0x55558.. <_ZTVN15NameSpace22ClassNameE+16>:    0x0000005..

これは、このクラスの変数がここで定義されていることを意味しますか?16バイトに戻ろうとして、これをClassNameにキャストしようとすると、有効な値が得られません。

そのような初心者の質問で申し訳ありませんが、私はかなり長い間グーグルでそれを見つけることができませんでした。

4

2 に答える 2

3

壊れた名前が表示されています。GDBにそれをデマングルするように指示することができます(または、さらに良いことに、今後は名前をデマングルします)。

set print demangle on

このWebサイトによると、このコマンドはGDBに次のように指示します。

タイプセーフなリンケージのためにアセンブラとリンカに渡されるエンコードされた(「マングルされた」)形式ではなく、ソース形式でC++名を出力します。デフォルトはオンです。

また、特定のアドレスのコードを表示するには、次のように記述します。

l *0x<address>
于 2012-07-20T11:35:20.873 に答える
2

そのシンボル名を解読する方法については、他の回答を参照してください。おそらく「vtableforNameSpace::ClassName」のようなものになるでしょう。(_ZTVで始まるg ++シンボルはvtableです。)

vtable内のオフセットへのポインタを見つけることは、通常、最も派生したタイプがそのクラスであるオブジェクトを含むメモリを見つけたことを示す非常に良い兆候です。もちろん、割り当てが解除されたメモリなどが残っていないことを保証するものではありません。

于 2012-07-20T11:44:29.217 に答える