在64位主机

时间:2017-03-16 07:29:14

标签: c gdb system-calls 32bit-64bit libc

我遇到一个或多个线程相互锁定的问题。我不知道那里发生了什么。调试器不能中断(线程1),中断但无法获得回溯(线程2 + 5)或显示回溯(线程3)

Debug view in eclipse. Gdb本机显示相同。

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。

1 个答案:

答案 0 :(得分:0)

我更新了更新的gdb版本(目前是最新版本,7.12.1)。这解决了这个问题。

请注意,gbd:i386在lubuntu x64上不起作用,而在lubuntu x32下它工作正常。另请注意,在lubuntu x64和x32上,main32和libc都是二进制相同的。