1

スレッドに奇妙な問題があります。引数なしまたは--helpオプション付きでプログラムを開始すると、すぐに終了します。

プログラムは、開始時にネットワーク チェッカー スレッドをロードします。一部のオンライン機能を終了または無効にするときは、単にネットワーク チェッカー スレッドを終了します。これは正しく行われているようです...私が呼び出すまでexit()

gdbでは、ネットワークチェッカーが正常に閉じられていることがわかりますが、メインプログラムが呼び出されると、いくつかのあいまいな理由でexit()呼び出さpthread_mutex_lock()れます。

バックトレースは次のとおりです。

(gdb) bt
#0  0x00007ffff711e804 in __lll_lock_wait () from /lib64/libpthread.so.0
#1  0x00007ffff711a0e0 in _L_lock_533 () from /lib64/libpthread.so.0
#2  0x00007ffff7119f79 in pthread_mutex_lock () from /lib64/libpthread.so.0
#3  0x00007ffff7dea3cd in _dl_fini () from /lib64/ld-linux-x86-64.so.2
#4  0x00007ffff6dbe6a1 in __run_exit_handlers () from /lib64/libc.so.6
#5  0x00007ffff6dbe725 in exit () from /lib64/libc.so.6
#6  0x0000000000413ec4 in option_handler (argc=1, argv=0x7fffffffdcb8) at autocrack.c:302
#7  0x00000000004135a7 in main (argc=1, argv=0x7fffffffdcb8) at autocrack.c:34

これは、関数内から呼び出した場合には発生しませんこれは、オプション ハンドラ内から呼び出した場合にのみ発生します。exit()mainexit()

grep -rin pthread_mutex_ .は自分のプログラムで他のどこでロックが使用されているかを見ていました: プログラムは決してこれらのポイントに到達してはいけません.

完全なソース コードは、https://github.com/tux-mind/autocrackにあります。

どうしたの?

4

1 に答える 1

3

ロックは_dl_fini、共有ライブラリ ファイルでグローバル デストラクタを実行するダイナミック リンカ/ローダの内部関数から取得されています。dlopenデストラクタを実行しているときに新しいライブラリが ( 経由で) ロードされないように、ロックを取得する必要があります。

この時点でクラッシュまたはハングが発生している場合は、プログラムのどこかで未定義の動作が発生しています。おそらく、無効なポインターを介した書き込みが原因です。Valgrind は、プログラムのどこにバグがあるかを判断するのに役立つ場合があります。

于 2012-09-01T22:51:27.553 に答える