【问题标题】:Error while loading libthread_db for cross-platform gdb-multiarch debugging为跨平台 gdb-multiarch 调试加载 libthread_db 时出错
【发布时间】:2021-08-10 01:12:00
【问题描述】:

我有一台在 x86 中运行 64 位 Linux 的主机,以及在 ARM 中运行 32 位 Linux 的目标板。我在主机上使用gdb-multiarch 来调试从目标板上运行的多线程二进制文件生成的核心转储文件。调试似乎有效(至少是btinfo threads 等基本的东西)。

但是,我在启动时看到与 libthread_db 相关的警告。我了解到您可以使用set debug libthread-db 1 来获取一些额外的调试消息,这就是我观察到的:

  1. 首先,我看到正在加载来自主机的libthread_db。由于版本不匹配而失败,但在我看来这似乎完全合理。毕竟,为什么我的目标板上的libpthread 与我主机上的libthread_db 兼容?
Trying host libthread_db library: libthread_db.so.1.
Host libthread_db.so.1 resolved to: /lib/x86_64-linux-gnu/libthread_db.so.1.
td_ta_new failed: versions of libpthread and libthread_db do not match
  1. 然后,我看到目标板上的libthread_db 正在加载(我的主机上有ARM 共享库)。似乎它失败了,因为dlopen 需要一个 64 位共享库,但这对我来说没有意义,因为核心转储是从 32 位二进制文​​件生成的。
Trying host libthread_db library: <snipped path>/lib/libthread_db.so.1.
dlopen failed:  <snipped path>/lib/libthread_db.so.1: wrong ELF class: ELFCLASS32.
thread_db_load_search returning 0
  1. 最后,gdb-multiarch 抱怨线程调试不可用。
warning: Unable to find libthread_db matching inferior's thread library, thread debugging will not be available.

我做错了什么导致 libthread_db 无法正确加载?

【问题讨论】:

    标签: linux gdb


    【解决方案1】:

    我做错了什么导致 libthread_db 无法正确加载?

    您没有做错任何事,但您需要有一个 x86_64 版本的 libthread_db.so.1,它与您的 32 位 ARM 目标上的 GLIBC 版本相同。

    或者,您可以在主机上使用 32 位 GDB。该 GDB 将能够dlopen &lt;snipped path&gt;/lib/libthread_db.so.1。由于您的目标是 32 位,因此在主机上使用 64 位 GDB 不会获得任何收益。

    更新:

    gdb 究竟将 libthread_db.so.1 用于什么目的?

    GDB 不知道 libpthread.so.0 的内部结构,因此它会动态加载 libthread_db.so.1 并询问 it 例如枚举线程并将它们告诉 GDB。

    显然,要使此动态加载 (dlopen) 起作用,libthread_db.so.1 必须与 GDB 位数和体系结构相匹配。但为了让libthread_db了解libpthread.so.0 的内部结构,它必须与目标使用的libpthread.so.0 版本匹配。

    你可能会问:libthread_db如何枚举目标进程中的线程?不需要知道下级(被调试)进程的内存内容吗?

    为什么是的,它确实如此,并且它使用 GDB 来执行低级读取和写入。

    即GDB调用libthread_db,它回调到GDB中进行低级劣质内存和寄存器访问,然后使用GDB提供的信息来构造更高级的概念(活动线程等)。

    【讨论】:

    • 您能否分享一些关于gdblibthread_db.so.1 用于什么用途的见解?当我在 ARM 目标上进行跨平台调试时,我仍然很困惑为什么gdb 会想要使用libthread_db.so.1x86_64 版本。无论如何,我很高兴听到我在gdb 设置中没有做错什么!
    • 关于您在 x86 主机上使用 32 位 GDB 的建议的另一个问题。您提到libthread_db.so.1 和 GDB 必须在位数和架构上匹配。但是,我的&lt;snipped path&gt;/lib/libthread_db.so.1 是 32 位的,是为 ARM 构建的(我不确定这个细节之前是否清楚)。如果我使用 32 位 GDB,这是否意味着架构不匹配?
    • @KenLin 是的,你的i*86 GDB 将无法使用 ARM libthread_db.so.1。您需要构建一个与目标libpthread.so.0 版本匹配的副本,但要针对运行 GDB 的主机。
    • 我明白了!我相信我的知识差距没有意识到 GDB 可以使用 x86 libthread_db了解 ARM @987654346 的内部结构@,只要它们版本匹配。 (换句话说,libthread_dblibpthread 在架构中匹配没有要求)。感谢您的帮助!
    猜你喜欢
    • 2015-10-16
    • 2014-09-28
    • 2013-09-28
    • 2019-06-12
    • 2023-01-31
    • 1970-01-01
    • 2018-05-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多