当前位置: 首页 > 知识库问答 >
问题:

64位主机上syscall 32bit程序线程卡顿时的调试

南门星河
2023-03-14

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

我了解到这种情况是因为libc在汇编程序中插入了这一点,gdb不能正确地walt堆栈。有时(我不知道什么时候),我可以在程序集中执行几个步骤,然后看到回溯。

我刚刚尝试了一个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;
}

SIGINT,打断。0x55579CD9在??()(gdb)bt

#00x55579CD9在??()

#1在__libc_start_main中的0x555B0AF3(main=0x80484dd,argc=1,argv=0xffffcee4,init=0x8048520<__libc_csu_init>,fini=0x8048590<__libc_csu_fini>,rtld_fini=0x55564160<_dl_fini>,stack_end=0xffffcedc)位于libc-start.c:287

流浪者@pc41388-spvm-4650:/tmp$gdb main64

GNU gdb(Ubuntu 7.7.1-0Ubuntu5~14.04.2)7.7.1版权所有(C)2014自由软件基金会,Inc.许可GPLv3+:GNU GPL版本3或更高版本http://GNU.org/licenses/GPL.html这是自由软件:您可以自由更改和重新发布它。在法律允许的范围内,没有保证。请键入“显示复制”和“显示保修”以了解详细信息。这个GDB被配置为“x86_64-linux-gnu”。键入“Show configuration”以获取配置详细信息。有关bug报告说明,请参阅:http://www.gnu.org/software/gdb/bugs/。在http://www.gnu.org/software/GDB/documentation/上查找GDB手册和其他文档资源。要获得帮助,请键入“help”。键入“apropos word”以搜索与“word”相关的命令...从Main64读取符号...(未找到调试符号)...已完成。

(gdb)r启动程序:/tmp/main64[启用了使用libthread_db的线程调试]使用主机libthread_db库“/lib/x86_64-linux-gnu/libthread_db.so.1”。b^C程序接收信号SIGINT,中断。0x00002AAAAAFE092A在__clock_nanosleep(clock_id=1,flags=0,req=0x7fffffffdc10,rem=0x2AAAAAFE092A<_clock_nanosleep+58>)中位于../sysdeps/unix/sysv/linux/clock_nanosleep.c:41 41.../sysdeps/unix/sysv/linux/clock_nanosleep.c:没有这样的文件或目录。

(gdb)bt

#0x00002AAAAAFE092A在__clock_nanosleep中(clock_id=1,flags=0,req=0x7FFFFFFFDC10,rem=0x2AAAAAFE092A<__clock_nanosleep+58>)在../sysdeps/unix/sysv/linux/clock_nanosleep。C:41

#1 main()(gdb)中的0x0000000000400630

所以我的问题是:是否有一个不同版本的libc,这在哪里工作?我使用的是Ubuntu14.04。

共有1个答案

戚阳曜
2023-03-14

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

请注意,GBD:i386在lubuntu x64上也不工作,而在lubuntu x32下工作得很好。还要注意,在lubuntu x64和x32上,main32和libc都是二进制相同的。

 类似资料:
  • 在Delphi XE7 64位VCL程序中,找不到单元: 而它在32位程序中没有问题: 那么如何在64位程序中使用呢?

  • 问题内容: 我有两个线程:主线程和从主线程生成的线程。 当主线程退出时,整个程序会终止吗? 问题答案: 没有。 当所有非守护程序线程完成时,Java程序终止。 该文档指出: Java虚拟机启动时,通常只有一个非守护程序线程(通常调用某些指定类的名为main的方法)。Java虚拟机将继续执行线程,直到发生以下任何一种情况: 类的方法已被调用,安全管理器已允许进行退出操作。 不是守护程序线程的所有线程

  • 问题内容: 我想知道x86和x64中的64位长吗? 问题答案: 是。Java 在任何JVM上都是64位,无一例外。所有Java原语类型都是完全可移植的,并且在所有实现中都具有固定的大小。

  • 问题内容: 我有一个专有程序,试图在64位系统上使用。 当我启动安装程序时,它可以正常运行,但是在尝试更新自身并编译一些模块之后,它无法加载它们。 我怀疑这是因为它正在使用gcc,而gcc试图将它们编译为64位系统,因此该程序无法使用这些模块。 是否有任何方法(一些环境变量或类似的东西)强制gcc为32位平台执行所有操作。32位chroot可以工作吗? 问题答案: 您需要使GCC使用该标志。 您可

  • 问题内容: 我有一个32位.so二进制库,我必须生成使用它的64位程序。有没有办法包装或转换它,使其可以与64位程序一起使用? 问题答案: 不能。您不能直接链接到64位程序内部的32位代码。 最好的选择是编译一个可以在64位平台上运行的32位(独立)程序(使用ia32),然后使用一种进程间通信的形式从64位程序与其进行通信。

  • 我有个奇怪的MSI!!!

  • 我在IO线程上有一个简单的工作,它正在改变主屏幕壁纸,之后我试图在UI线程上运行一些动画: 但这种方法会导致错误:<代码>java。lang.IllegalStateException:观察者必须从主UI线程订阅,但它是线程[RxCachedThreadScheduler-1,5,main] 我尝试将第二个可观察更改为: 但这于事无补。

  • 问题内容: 如果我在无限循环中有一个线程,有没有办法在主程序结束时(例如,当我按 +时 )终止它? 问题答案: 检查这个问题。正确答案对如何以正确的方式终止线程有很好的解释: 是否有任何方法可以杀死Python中的线程? 要使线程在键盘中断信号(ctrl + c)上停止,您可以在退出之前捕获异常“ KeyboardInterrupt”并进行清除。像这样: 这样,您可以控制程序突然终止时的处理方式。