0

プログラムをコーディングしていますが、実行中のある時点でクラッシュし、次のスタック トレースが出力されます。

pure virtual method called
terminate called without an active exception
0  prog            0x08f04a98
1  prog            0x08f05147
2                  0xb7802400 __kernel_sigreturn + 0
3  libc.so.6       0xb758fbb2 abort + 386
4  libstdc++.so.6  0xb778653f __gnu_cxx::__verbose_terminate_handler() + 335
5  libstdc++.so.6  0xb7784405
6  libstdc++.so.6  0xb7784442
7  libstdc++.so.6  0xb77850f5
8  prog            0x08f2cb1f proj::raw_ostream::write(char const*, unsigned int) + 159
9  prog            0x081df8fe
10 prog            0x081d079b
11 prog            0x08e8ac02 proj::Value::~Value() + 130
12 prog            0x082749ad
13 prog            0x08e1cd62 proj::Tiny::~Tiny() + 178
14 prog            0x08e1fc86 proj::Alloca::~Alloca() + 38
15 prog            0x08e252ac proj::Alloca::~Alloca() + 44
16 prog            0x088e9bbc
17 prog            0x088e9b64
18 prog            0x08d3782e
19 prog            0x08d36a46
20 prog            0x08d34e95 proj::Medium::~Medium() + 485
21 prog            0x08d34c9c proj::Medium::~Medium() + 44
22 prog            0x08d3753c
23 prog            0x08d36da4
24 prog            0x08d350ed proj::Medium::eraseFromParent() + 109
25 prog            0x08dc780d proj::Big::dropAllReferences() + 253
26 prog            0x08e530b9 proj::Module::dropAllReferences() + 137
27 prog            0x08e52ea0 proj::Module::~Module() + 64
28 prog            0x08c602cb proj::Engine::~Engine() + 155
29 prog            0x08743e00 proj::Controller::~Controller() + 192
30 prog            0x08743d2c proj::Controller::~Controller() + 44
31 prog            0x081cdee9
32 libc.so.6       0xb75912df
33 libc.so.6       0xb759134f
34 libc.so.6       0xb7578cae __libc_start_main + 238
35 prog            0x081cc501

3列目の住所は?それらは関数アドレスだと思いますが、そうですか?ある時点で何らかの仮想関数が呼び出されているようですが、どの仮想関数が呼び出されているかを知るにはどうすればよいですか?

4

3 に答える 3

1

3列目はスタックに記録されたプログラムカウンターなのでコードアドレスになります。

デストラクタ内で純粋な仮想を呼び出しているかどうかを確認する必要があります。proj::Value::~Value()で純粋な仮想を呼び出している可能性が最も高いですproj::Value

于 2012-06-15T18:18:31.590 に答える
1

はい、関数アドレスです。そのダンプに対応するコア ファイルがあり、デバッグ シンボルを使用してコンパイルした場合は、コアと実行可能ファイルを にロードしgdb、コマンドを使用できますlist *<address>。そのアドレスに対応するコード行が表示されます。

コードを見なければ、仮想メソッドwriteだと思います。raw_ostream

于 2012-06-15T18:19:13.930 に答える
0

3 番目の列は、関数スタックで実行されている実際のメモリ アドレスです (4 番目の列と同じである必要があります。これにより、名前付き関数の先頭からのオフセットが得られます)。

関数スタックが成長して表示されます。前に示した行は、コール スタックでより深くネストされています。別の言い方をすれば、あなたmainはリストの一番下にいます

仮想関数が から呼び出されproj::Value::~Value()、それが を呼び出しproj::raw_ostream::write(char const*, unsigned int)、例外が発生します。

于 2012-06-15T18:19:47.750 に答える