簡體   English   中英

exit()調用pthread_mutex_lock()

[英]exit() call pthread_mutex_lock()

線程有一個奇怪的問題。 如果我在沒有參數或使用--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

當我從main函數中調用exit()時,這不會發生。 這只發生在我從選項處理程序內部調用exit()

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

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

這是怎么回事?

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM