exit()调用pthread_mutex_lock()

时间:2012-09-01 18:25:04

标签: c pthreads libc

线程有一个奇怪的问题。如果我在没有参数或--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

找到

发生了什么事?

1 个答案:

答案 0 :(得分:3)

锁是从_dl_fini获得的,dlopen是动态链接器/加载器中的内部函数,负责在共享库文件中运行全局析构函数。它必须获得一个锁,以确保在运行析构函数的同时不会加载任何新库(通过{{1}})。

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