Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
exit()调用pthread_mutex_lock()_C_Pthreads_Libc - Fatal编程技术网

exit()调用pthread_mutex_lock()

exit()调用pthread_mutex_lock(),c,pthreads,libc,C,Pthreads,Libc,我的线程有一个奇怪的问题。如果启动程序时没有参数或使用--help选项,程序将立即退出 程序在启动时加载网络检查器线程。当要退出或禁用某些联机功能时,它只会终止网络检查器线程。这似乎是正确的。。。直到我调用exit() 在gdb上,我可以看到网络检查器已成功关闭-但由于一些模糊的原因,当主程序调用exit()时,也会调用pthread\u mutex\u lock() 这是回溯: (gdb) bt #0 0x00007ffff711e804 in __lll_lock_wait () from

我的线程有一个奇怪的问题。如果启动程序时没有参数或使用
--help
选项,程序将立即退出

程序在启动时加载网络检查器线程。当要退出或禁用某些联机功能时,它只会终止网络检查器线程。这似乎是正确的。。。直到我调用
exit()

在gdb上,我可以看到网络检查器已成功关闭-但由于一些模糊的原因,当主程序调用
exit()
时,也会调用
pthread\u mutex\u 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\u mutex.
来查看我的程序中还使用了哪些锁:程序不应该达到这些点

完整的源代码可以在


发生了什么?

锁是从
\u dl_fini
获取的,这是动态链接器/加载程序中的一个内部函数,负责在共享库文件中运行全局析构函数。它必须获得一个锁,以确保在运行析构函数的同时没有加载新库(通过
dlopen


如果此时遇到崩溃或挂起,则可能是通过无效指针的写入在程序中的某个地方调用了未定义的行为。Valgrind可能可以帮助您确定程序中的错误所在。

+1:我想说,内存损坏可能发生在库的pthread_互斥体内存之上。它可能认为互斥锁已锁定,正在等待它被解锁,这当然永远不会发生。很抱歉,回复太晚,valgrind没有用,因为它会随着死锁而停止。如果我按Ctrl+C键,我的程序就会捕捉到这个并自杀……但valgrind仍然冻结。奇怪的是,当我的程序还没有死(等待SIGITT)时,我不能在PS——PaldID代码> PaldValrng<代码> -l中,为什么?在CONTION.LoG中,我找到了这个配置给的选项:-------O-xCXAyAtExt,但它只在C++中工作,对吗?哪个程序的配置?这听起来像是
gcc-v
的输出,告诉您gcc是如何配置的,与您的程序无关……这是./configure脚本的日志……给您: