2012-09-01 78 views
1

我有一個線程奇怪的問題。如果我啓動我的程序沒有參數或--help選項,它將立即退出。退出()調用pthread_mutex_lock()

程序在啓動時加載網絡檢查程序線程。當需要退出或禁用某些在線功能時,它只會終止網絡檢查程序線程。這似乎做得正確......直到我撥打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()從我main函數內部此發生。這隻發生在我撥打exit()from inside the option handler時。

我使用grep -rin pthread_mutex_ .來查看我的程序中使用了哪些鎖:程序不應該達到這些點。

完整的源代碼可以在https://github.com/tux-mind/autocrack

這是怎麼回事找到?

回答

3

該鎖正從_dl_fini獲得,動態鏈接器/加載器中的內部函數負責在共享庫文件中運行全局析構函數。它必須獲得一個鎖,以確保在運行析構函數的同時沒有新的庫被加載(通過dlopen)。

如果您在此時遇到崩潰或掛起問題,那麼您可能會在程序的某處調用未定義的行爲,可能是通過寫入無效指針。 Valgrind可以幫助您確定程序中的錯誤。

+0

+1:我想說很可能是內存損壞發生在庫的pthread_mutex內存上。它可能認爲互斥鎖已鎖定,正在等待它被解鎖,這當然不會發生。 –

+0

對於遲到的回覆感到抱歉, valgrind無用,因爲它會隨着僵局而停止。 如果我按Ctrl + C我的程序趕上這個和自殺......但valgrind仍然凍結。 非常奇怪的是,當我的程序還沒有死時(等待SIGINT)我不能在ps --ppid'pidof valgrind' -L中選擇它,爲什麼? –

+0

在config.log我發現這個選項是給定的配置: --enable -__ cxa_atexit 但它應該只在c + +,對不對? –