调试 pthread 需要什么?

2024-01-10

我想在我的自定义 Linux 发行版上调试 pthreads,但我缺少一些东西。我的主机是 Ubuntu 12.04,我的目标是使用 crosstool-NG 交叉编译器工具集构建的 i486 定制嵌入式 Linux,操作系统的其余部分是使用 Buildroot 制作的。

我将列出事实:

  • 我可以在我的目标上运行多线程应用程序

  • 谷歌 Breakpad http://code.google.com/p/google-breakpad/当我在目标上运行多线程应用程序时,无法创建崩溃报告。当我在主机上运行具有完全相同的 Breakpad 库构建的完全相同的应用程序时,它将会成功。

  • GDB 无法在我的目标上调试多线程应用程序。

e.g.

$./gdb -n -ex "thread apply all backtrace" ./a.out --pid 716

dlopen failed on 'libthread_db.so.1' - /lib/libthread_db.so.1: undefined symbol: ps_lgetfpregs
GDB will not be able to debug pthreads.
GNU gdb 6.8

我不认为 ps_lgetfpregs 是一个问题,因为this http://permalink.gmane.org/gmane.linux.debian.devel.glibc/4409.

  • 我的 crosstool 构建创建了 libthread_db.so 文件,并将其放在目标上。

  • 我的 crosstool 构建为我的目标创建了 gdb,因此它应该链接到我在目标上运行的相同库。

  • 如果我在主机上针对我的测试应用程序运行 gdb,我会得到每个正在运行的线程的回溯。

我怀疑 Breakpad 的问题与 GDB 的问题有关,但我无法证实这一点。唯一的共同点是缺乏多线程调试。

我的主机和目标之间存在一些关键差异,这使我无法在目标上调试 pthread。

有谁知道它是什么?

EDIT:

丹尼斯·德米特里延科 http://e2e.ti.com/support/embedded/linux/f/354/t/52720.aspxTI 说:

通常,GDB 不是很挑剔,你可以混合搭配不同的 gdb 和 gdbserver 的版本。但是,不幸的是,如果您需要 调试多线程应用程序,有一些特定的依赖项 蜜蜂...

例如,如果您没有这样做,这是您可能会看到的消息之一 正确构建 GDB 以支持线程:

dlopen 在“libthread_db.so.1”上失败 - /lib/libthread_db.so.1: 未定义符号:ps_lgetfpregs GDB 将无法调试 线程。

请注意,此错误与我收到的错误相同,但他没有详细介绍如何“正确”构建 GDB。

and the GDB FAQ http://sourceware.org/gdb/wiki/FAQ says:

(Q) 除了发生崩溃的线程之外,GDB 没有看到任何线程; 或者当我设置断点时 SIGTRAP 会终止我的程序。

(一)经常这样 发生在 Linux 上,尤其是嵌入式目标上。常见的有两种 原因:

  • 你正在使用 glibc,并且你已经剥离了 libpthread.so.0

  • libpthread.so.0 和 libthread_db.so.1 之间不匹配

GDB本身就是这样的 不知道如何解码 glibc 维护的“线程控制块”和 被认为是 glibc 私有实现细节。它用 libthread_db.so.1(glibc 的一部分)来帮助它做到这一点。所以, libthread_db.so.1 和 libpthread.so.0 的版本必须匹配 编译标志。另外,libthread_db.so.1需要一定的 libpthread.so.0 中存在的非全局符号。

解决办法:使用 strip --strip-debug libpthread.so.0 而不是 strip libpthread.so.0。

我尝试了未剥离的 libpthread.so.0 但没有什么区别。我将调查 pthread 和 thread_db 之间的任何不匹配。


This:

dlopen failed on 'libthread_db.so.1' - /lib/libthread_db.so.1: undefined symbol: ps_lgetfpregs
GDB will not be able to debug pthreads.

意味着libthread_db.so.1图书馆无法找到该符号ps_lgetfpregs在 gdb 中。

Why?

因为我使用 Crosstoolg-NG 和“构建静态本机 gdb”选项构建了 gdb,这添加了-static海湾合作委员会的选项。

本机 gdb 是用-rdynamic选项,这会填充.dynsym https://blogs.oracle.com/ali/entry/inside_elf_symbol_tablesELF 文件中的符号表包含所有符号,甚至包括未使用的符号。 libread_db 使用这个符号表来查找ps_lgetfpregs来自 gdb。

But -static剥离.dynsymELF 文件中的表。

此时有两个选择:

  1. 如果您想调试线程,请不要构建静态本机 gdb。
  2. 构建静态gdb和静态libthread_db(未测试)

Edit:

顺便说一句,这并不能解释为什么 Breakpad 无法在我的目标上调试多线程应用程序。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

调试 pthread 需要什么? 的相关文章

随机推荐

  • 在 Chart.js 中的图例上显示点样式

    https jsfiddle net 43Tesseracts qmhhc089 https jsfiddle net 43Tesseracts qmhhc089 对于此图表的第一个数据集XPData 如何设置图例样式以使用点而不是线 我希
  • 对“__ubsan_handle_nonnull_arg”的未定义引用[重复]

    这个问题在这里已经有答案了 最近几天我一直在研究问题集拼写器 到目前为止这就是我所拥有的 不幸的是 它无法编译 我有点迷失了 如果有人能帮助我并告诉我我做错了什么 我将非常感激 Implements a dictionary s funct
  • 如何使用 JQuery 在将鼠标悬停在元素上 2 秒时触发点击?

    如何触发这个内联函数onClick showMenu mnu searches event 0 this 使用 JQuery 如果我将鼠标悬停在a menu arrow 我需要在用户将鼠标悬停在元素上 2 秒后触发点击 任何帮助将不胜感激
  • 证书已过期或已被吊销

    不久前 我开始编写一个新的 iOS 应用程序 休息了很长一段时间后 我再次开始工作 并且几乎完成了 我在模拟器上测试了它 但当我尝试在 iPhone 6 上安装它时 我过去已经做过的事情 我收到一条错误消息 告诉我无法安装我的应用程序 因为
  • ONVIF 获取系统日期和时间请求

    一旦我从 UDP 多播请求返回 239 255 255 250 的响应 我返回带有 XAddrs 的 ProbeMatchhttp 10 10 10 10 1234 onvif device service 我现在如何执行 GetSyste
  • 如何在 SwiftUI 中暂停动画?

    我不知道如何停止withAnimation 启动后的方法 我正在使用 SwiftUI 编写我的第一个应用程序 我想创建一个进度圈 它将由用户使用按钮控制 开始按钮 它将启动动画 其中圆圈将在最后未填充 停止按钮将必须保存实际的填充点的状态并
  • 如何使用 Google Analytics 确定客户所在的国家/地区?

    我的页面使用 GA 为自己提供统计数据 我稍后可以看到访问我网站最多的国家 地区 有什么办法可以在客户端获取客户的国家 地区吗 如果用户不是来自我的国家 我想向她显示一条通知 您无法使用 GA 在浏览器中访问该信息 如果您想在浏览器中访问该
  • 子程序、协程、函数和线程之间的区别?

    过去两天我一直在阅读 编程艺术 第一卷 有一个关于子程序和协程的主题 我很困惑 我不明白书上说协程是在 main 之后初始化的 这与子例程不同 此外 被调用的协程成为调用协程的子例程 我尝试研究之前在这里提出的问题 在相同的上下文中我也了解
  • Akeneo安装/NODE_PATH=node_modules无法识别/yarn运行webpack错误

    我已经在 git 上问过这个问题了 https github com akeneo pim community dev issues 7191 https github com akeneo pim community dev issues
  • Linux 上的 SO_REUSEPORT

    我想知道 LINUX 2 6 中是否启用了 SO REUSEPORT 选项 如果我尝试使用它并编译我的代码 我会收到以下错误 01 c 72 error SO REUSEPORT undeclared first use in this f
  • 反应本机打字稿屏幕测试返回测试套件无法运行。错误反应本机权限:NativeModule.RNPermissions 为空

    我在编写反应本机测试时遇到困难 其中涉及模拟用打字稿编写的互联网和振动权限 使用以下 URL 中的说明 如何从 React Native 模拟 PermissionAndroid https stackoverflow com questi
  • 如何在 pubspec.yaml 中设置使用最新版本的包?

    如何在 pubspec yaml 中为 Dart 项目设置使用最新版本的包 我可以做类似的事情吗 dev dependencies build runner latest build web compilers latest 在 pubsp
  • Process.Start() 抛出“访问被拒绝”错误

    当我执行一个进程并尝试重定向输出 错误时 出现以下错误 System ComponentModel Win32Exception 0x80004005 Access is denied at System Diagnostics Proce
  • 如何在从jquery动态添加的html中渲染vuejs组件

    我在 html 中有一个从 jquery ajax 调用返回的 vuejs 组件 但它不渲染该组件 那么如何让vuejs从jquery渲染这个组件呢 jquery 代码示例 post baseURL media postData funct
  • 如何在 React 15 中创建默认为空的受控输入

    我想要控制文本输入 但它需要支持空值 这是我的组件 import React Component PropTypes from react import ControlLabel FormControl FormGroup from rea
  • 处理来自多个 AJAX JQuery 查询的独立数据

    我有许多从 for 循环发送的 AJAX 请求 并且希望根据循环中的位置将一些数据发送到回调函数 当我尝试将一个函数附加到每个请求时 它们似乎都从上次调用中获取数据 例如 for var i 0 i lt 4 i data some uni
  • 为什么 C# 中字典优于 Hashtable?

    在大多数编程语言中 字典优于哈希表 这背后的原因是什么 就其价值而言 一本字典is 概念上 哈希表 如果您的意思是 我们为什么要使用Dictionary
  • Kinect SDK 2 与 Xbox 360 Kinect 兼容吗?

    我正在尝试使用 Xbox 360 的 Kinect 开发一个有趣的人脸识别应用程序 我想知道应该使用哪个 SDK 和 Visual Studio 版本才能最好地访问 Kinect Kinect SDK 2 与 Xbox 360 Kinect
  • BoostBuild:patchlevel.h 不存在

    我正在尝试在 Ubuntu 11 04 上使用 bjam 编译 C 项目 我不断收到以下错误 libraries boost 1 44 0 boost python detail wrap python hpp 75 24 fatal er
  • 调试 pthread 需要什么?

    我想在我的自定义 Linux 发行版上调试 pthreads 但我缺少一些东西 我的主机是 Ubuntu 12 04 我的目标是使用 crosstool NG 交叉编译器工具集构建的 i486 定制嵌入式 Linux 操作系统的其余部分是使