1

我对线程有一个奇怪的问题。如果我在没有参数或--help选项的情况下启动程序,它将立即退出。

该程序在启动时加载一个网络检查器线程。当需要退出或禁用某些在线功能时,它只是终止网络检查器线程。这似乎是正确完成的......直到我打电话给exit().

在 gdb 上,我可以看到网络检查器已成功关闭 - 但由于一些模糊的原因,当主程序调用exit()then时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()mainexit()

我曾经grep -rin pthread_mutex_ .看到在我的程序中还有哪些地方使用了锁:程序永远不应该达到这些点。

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

这是怎么回事?

4

1 回答 1

3

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

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

于 2012-09-01T22:51:27.553 回答