线程有一个奇怪的问题。如果我在没有参数或--help
选项的情况下启动程序,它将立即退出。
程序在启动时加载网络检查程序线程。当退出或禁用某些在线功能时,它只是终止网络检查程序线程。这似乎是正确完成的...直到我拨打exit()
。
在gdb上,我可以看到网络检查程序已成功关闭 - 但由于某些不明原因,当主程序调用{{1}}时,也会调用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
from inside the option handler时才会发生。
我使用exit()
来查看我的程序中使用了哪些锁:程序永远不应该达到这些点。
完整的源代码可以在https://github.com/tux-mind/autocrack
找到发生了什么事?
答案 0 :(得分:3)
锁是从_dl_fini
获得的,dlopen
是动态链接器/加载器中的内部函数,负责在共享库文件中运行全局析构函数。它必须获得一个锁,以确保在运行析构函数的同时不会加载任何新库(通过{{1}})。
如果此时遇到崩溃或挂起,您可能会在程序中的某处调用未定义的行为,可能是通过无效指针进行写入。 Valgrind可以帮助您确定程序中的错误位置。