调试 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 需要什么? 的相关文章

  • Linux 中 m 标志和 o 标志将存储在哪里

    我想知道最近收到的路由器通告的 m 标志和 o 标志的值 从内核源代码中我知道存储了 m 标志和 o 标志 Remember the managed otherconf flags from most recently received R
  • 有没有一种快速方法可以从 Jar/war 中删除文件,而无需提取 jar 并重新创建它?

    所以我需要从 jar war 文件中删除一个文件 我希望有类似 jar d myjar jar file I donot need txt 的内容 但现在我能看到从 Linux 命令行执行此操作的唯一方法 不使用 WinRAR Winzip
  • 如何为 Linux 桌面条目文件指定带有相对路径的图标?

    对于我的一个 Linux 应用程序 我有应用程序二进制文件 一个 launcher sh 脚本 针对 LD LIBRARY PATH 和一个 desktop 文件 所有这些都位于同一文件夹中 我想使用图标的相对路径而不是绝对路径 我试过了
  • 我们真的应该使用 Chef 来管理 sudoers 文件吗?

    这是我的问题 我担心如果 Chef 破坏了 sudoers 文件中的某些内容 可能是 Chef 用户错误地使用了说明书 那么服务器将完全无法访问 我讨厌我们完全失去客户的生产服务器 因为我们弄乱了 sudoers 文件并且无法再通过 ssh
  • 在centos中安装sqlite3 dev和其他包

    我正在尝试使用 cpanel 在 centos 机器上安装 sqlite dev 和其他库 以便能够编译应用程序 我对 debian 比 centos 更熟悉 我知道我需要的库是 libsqlite3 dev libkrb5 dev lib
  • GMail 421 4.7.0 稍后重试,关闭连接

    我试图找出为什么它无法使用 GMail 从我的服务器发送邮件 为此 我使用 SwiftMailer 但我可以将问题包含在以下独立代码中
  • 如何使用waf构建共享库?

    我想使用构建一个共享库waf http code google com p waf 因为它看起来比 GNU 自动工具更容易 更简洁 到目前为止 我实际上有几个与我开始编写的 wscript 有关的问题 VERSION 0 0 1 APPNA
  • Intel 上的 gcc 中的 _mm_pause 用法

    我参考过这个网页 https software intel com en us articles benefitting power and performance sleep loops https software intel com
  • 如何在 *nix 中登录时运行脚本?

    我知道我曾经知道如何做到这一点 但是 如何在 unix 中登录时运行脚本 bash 可以 From 维基百科 Bash http en wikipedia org wiki Bash 28Unix shell 29 当 Bash 启动时 它
  • Linux 为一组进程保留一个处理器(动态)

    有没有办法将处理器排除在正常调度之外 也就是说 使用sched setaffinity我可以指示线程应该在哪个处理器上运行 但我正在寻找相反的情况 也就是说 我想从正常调度中排除给定的处理器 以便只有已明确调度的进程才能在那里运行 我还知道
  • linux下如何从文本文件中获取值

    我有一些文本格式的文件 xxx conf 我在这个文件中有一些文本 disablelog 1 当我使用 grep r disablelog oscam conf 输出是 disablelog 1 但我只需要值1 请问你有什么想法吗 一种方法
  • 使用 gdb 调试 Linux 内核模块

    我想知道 API 在内核模块 中返回什么 从几种形式可以知道 这并不是那么简单 我们需要加载符号表来调试内核模块 所以我所做的就是 1 尝试找到内核模块的 text bss和 data段地址 2 在 gdb 中使用 add symbol f
  • Apache 访问 Linux 中的 NTFS 链接文件夹

    在 Debian jessie 中使用 Apache2 PHP 当我想在 Apache 的文档文件夹 var www 中创建一个新的小节时 我只需创建一个指向我的 php 文件所在的外部文件夹的链接 然后只需更改该文件夹的所有者和权限文件夹
  • 我什么时候应该编写 Linux 内核模块?

    有些人出于某种原因想要将 Linux 中的代码从用户空间移动到内核空间 很多时候 原因似乎是代码应该具有特别高的优先级 或者只是 内核空间更快 这对我来说似乎很奇怪 我什么时候应该考虑编写内核模块 有一套标准吗 我怎样才能激励将代码保存在
  • cdc_acm:无法设置 dtr/rts - 无法与 USB cdc 设备通信

    我试图使用 pic24fj128gb206 枚举 usb cdc 设备 设备似乎已正确枚举 但是当我将设备连接到 Linux PC 时 我从内核收到以下警告消息 cdc acm 1 8 1 6 7 1 0 failed to set dtr
  • 如何在 Mac OSX Mavericks 中正确运行字符串工具?

    如何在 Mac OSX Mavericks 中正确运行字符串工具 我尝试按照我在网上找到的示例来运行它 strings a UserParser class 但我收到此错误 错误 Applications Xcode app Content
  • 如何让 Node.js 作为后台进程运行并且永不死掉?

    我通过 putty SSH 连接到 linux 服务器 我尝试将其作为后台进程运行 如下所示 node server js 然而 2 5 小时后 终端变得不活动 进程终止 即使终端断开连接 我是否也可以使进程保持活动状态 Edit 1 事实
  • 为什么同一个curl命令在windows和linux下输出不同的东西?

    为什么同样的curl o file https www link com 命令输出不同的东西 例如 如果我运行命令curl o source txt https www youtube com playlist list PLIx6Fwnp
  • x86-64 AMD 上 CALL 指令的操作数生成

    以下是示例程序 objdump 的输出 080483b4
  • 使用自定义堆的类似 malloc 的函数

    如果我希望使用自定义预分配堆构造类似 malloc 的功能 那么 C 中最好的方法是什么 我的具体问题是 我有一个可映射 类似内存 的设备 已将其放入我的地址空间中 但我需要获得一种更灵活的方式来使用该内存来存储将随着时间的推移分配和释放的

随机推荐

  • 在 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 操作系统的其余部分是使