17

次の出力でバックトレースを提供する場合、それはどういう意味ですか?

#0  0x00000008009c991c in pthread_testcancel () from /lib/libpthread.so.2
#1  0x00000008009b8120 in sigaction () from /lib/libpthread.so.2
#2  0x00000008009c211a in pthread_mutexattr_init () from /lib/libpthread.so.2
#3  0x0000000000000000 in ?? ()

プログラムは、標準シグナル 11、セグメンテーション違反でクラッシュしました。私のアプリケーションは、スレッド ライブラリとして pthread を使用して、FreeBSD 6.3 で実行されるマルチスレッド FastCGI C++ プログラムです。

情報ソースによると、これは -g でコンパイルされており、ソースのすべてのシンボル テーブルが読み込まれています。

明らかなように、実際のコードはトレースに表示されませんが、代わりにエラーは標準の pthread ライブラリから発生しているようです。特に、??とは? ()????

EDIT : 最終的に、メイン コードの標準の無効なメモリ アクセスまでクラッシュを追跡しました。スタック トレースが破損した理由は説明しませんが、それは別の日の質問です :)

4

5 に答える 5

13

gdb は、pthread_mutexattr_init から適切な戻りアドレスを抽出できませんでした。アドレスは 0 です。シンボル テーブルでアドレス 0 を検索した結果です。シンボリック名が見つからないため、デフォルトの「??」が出力されます。

残念ながら、正しいリターンアドレスを抽出できなかった理由はわかりません。

于 2008-09-23T14:32:34.973 に答える
8

スレッド化ライブラリがクラッシュする原因となった何かがありました。スレッド ライブラリ自体はデバッグ シンボル (-g) を使用してコンパイルされていないため、クラッシュが発生したソース コード ファイルまたは行番号を表示できません。さらに、これはスレッドであるため、コール スタックはファイルを指し示しません。残念ながら、これは追跡するのが難しいバグです。コードをステップ実行して、正確にクラッシュが発生したときに絞り込む必要があります。

于 2008-09-23T14:50:38.643 に答える
4

必ずデバッグ シンボルを使用してコンパイルしてください。(gccの場合、それは -g オプションだと思います)。そうすれば、GDB からさらに興味深い情報を取得できるはずです。製品版をコンパイルするときは、オフにすることを忘れないでください。

于 2008-09-23T14:31:55.130 に答える
3

私は何かが欠けている可能性がありますが、これは誰かNULLが関数ポインタとして使用していることを示していませんか?

#include <stdio.h>

typedef int (*funcptr)(void);

int
func_caller(funcptr f)
{
    return (*f)();
}

int
main()
{
    return func_caller(NULL);
}

これを gdb で実行すると、同じスタイルのバックトレースが生成されます。

rivendell$ gcc -g -O0 foo.c -o foo
rivendell$ gdb --quiet foo
Reading symbols for shared libraries .. done
(gdb) r
Starting program: ...
Reading symbols for shared libraries . done

Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_PROTECTION_FAILURE at address: 0x00000000
0x00000000 in ?? ()
(gdb) bt
#0    0x00000000 in ?? ()
#1    0x00001f9d in func_caller (f=0) at foo.c:8
#2    0x00001fb1 in main () at foo.c:14

ただし、これはかなり奇妙なクラッシュです...pthread_mutexattr_initデータ構造とそれを割り当てる以上のことはめったにありませんmemset。他に何が起こっているかを探します。スレッドライブラリの不一致などの可能性はありますか。私の BSD の知識は少し古くなっていますが、以前はこれに関する問題がありました。

于 2008-11-29T19:25:50.217 に答える
1

クラッシュの原因となったバグによってスタックが壊れた (スタックの一部が上書きされた) 可能性がありますか? その場合、バックトレースは役に立たない可能性があります。その場合どうすればいいのかわからない…

于 2008-09-23T14:42:00.270 に答える