我遇到一个或多个线程相互锁定的问题。我不知道那里发生了什么。调试器不能中断(线程1),中断但无法获得回溯(线程2 + 5)或显示回溯(线程3)
我learned这是个例子,因为libc在汇编程序中实现了这个,gdb无法正确地使用堆栈。有时候(我不知道什么时候),我可以在装配中做几步,然后我看到回溯。
我刚试了一个x64程序,但它确实有效。
请参阅我的示例代码:
#include <time.h>
int main()
{
while(1)
{
struct timespec ts;
ts.tv_sec = 1;
ts.tv_nsec = 0;
clock_nanosleep(CLOCK_MONOTONIC, 0, &ts, 0);
}
return 1;
}
gdb输出32位:
vagrant @ PC41388-spvm-4650:/ tmp $ gdb main32
GNU gdb(Ubuntu 7.7.1-0ubuntu5~14.04.2)7.7.1版权所有(C)2014 Free Software Foundation,Inc。许可证GPLv3 +:GNU GPL版本3或更高版本 http://gnu.org/licenses/gpl.html这是免费软件:你是免费的 改变并重新分配它。在某种程度上没有任何保证 法律允许的。键入&#34;显示复制&#34;并且&#34;显示保修&#34;对于 细节。此GDB配置为&#34; x86_64-linux-gnu&#34;。输入&#34;显示 构造&#34;有关配置详情。用于错误报告 说明,请参阅:http://www.gnu.org/software/gdb/bugs/。 在线查找GDB手册和其他文档资源: http://www.gnu.org/software/gdb/documentation/。如需帮助,请输入 &#34;帮助&#34 ;.输入&#34; apropos word&#34;搜索与之相关的命令 &#34; word&#34; ...从main32读取符号...(没有调试符号 发现)...完成。
(gdb)r启动程序:/ tmp / main32 [Thread 使用libthread_db启用调试]使用主机libthread_db库 &#34; /lib/x86_64-linux-gnu/libthread_db.so.1" ;. ^ C程序接收信号
SIGINT,中断。 0x55579cd9在? ()(gdb)bt
#0 0x55579cd9在? ()
__libc_start_main中的#1 0x555b0af3(main = 0x80484dd,argc = 1, argv = 0xffffcee4,init = 0x8048520&lt; __ libc_csu_init&gt;, fini = 0x8048590&lt; __ libc_csu_fini&gt;,rtld_fini = 0x55564160&lt; _dl_fini&gt;, stack_end = 0xffffcedc)at libc-start.c:287
_start()(gdb)中的#2 0x08048401
gdb输出64位:
vagrant @ PC41388-spvm-4650:/ tmp $ gdb main64
GNU gdb(Ubuntu 7.7.1-0ubuntu5~14.04.2)7.7.1版权所有(C)2014 Free Software Foundation,Inc。许可证GPLv3 +:GNU GPL版本3或更高版本 http://gnu.org/licenses/gpl.html这是免费软件:你是免费的 改变并重新分配它。在某种程度上没有任何保证 法律允许的。键入&#34;显示复制&#34;并且&#34;显示保修&#34;对于 细节。此GDB配置为&#34; x86_64-linux-gnu&#34;。输入&#34;显示 构造&#34;有关配置详情。用于错误报告 说明,请参阅:http://www.gnu.org/software/gdb/bugs/。 在线查找GDB手册和其他文档资源: http://www.gnu.org/software/gdb/documentation/。如需帮助,请输入 &#34;帮助&#34 ;.输入&#34; apropos word&#34;搜索与之相关的命令 &#34; word&#34; ...从main64读取符号...(没有调试符号 发现)...完成。
(gdb)r启动程序:/ tmp / main64 [Thread 使用libthread_db启用调试]使用主机libthread_db库 &#34; /lib/x86_64-linux-gnu/libthread_db.so.1" ;. b ^ C收到的节目 信号SIGINT,中断。 __clock_nanosleep中的0x00002aaaaafe092a (clock_id = 1,flags = 0, req = 0x7fffffffdc10,rem = 0x2aaaaafe092a&lt; __ clock_nanosleep + 58&gt;) 在../sysdeps/unix/sysv/linux/clock_nanosleep.c:41 41 ../sysdeps/unix/sysv/linux/clock_nanosleep.c:没有这样的文件或 目录。
(gdb)bt
__clock_nanosleep中的#0 0x00002aaaaafe092a(clock_id = 1,flags = 0, req = 0x7fffffffdc10,rem = 0x2aaaaafe092a&lt; __ clock_nanosleep + 58&gt;) at ../sysdeps/unix/sysv/linux/clock_nanosleep.c:41
主()(gdb)中的#1 0x0000000000400630
set architecture i386
也无济于事。
更多新闻:info proc mapp
显示x32应用位于[vvar]
,而x64应用位于libc。这可以解释为什么gdb无法找到回溯。
所以我的问题是:是否有不同版本的libc,这有效吗?我正在使用ubuntu14.04。
答案 0 :(得分:0)
我更新了更新的gdb版本(目前是最新版本,7.12.1)。这解决了这个问题。
请注意,gbd:i386在lubuntu x64上不起作用,而在lubuntu x32下它工作正常。另请注意,在lubuntu x64和x32上,main32和libc都是二进制相同的。