linux - 来自 linux 核心转储的线程特定数据

标签 linux gdb coredump

在分析 Linux 的核心转储时,如何获取指向线程本地存储或线程特定数据的指针?

我使用 pthread_setspecific 将一些数据存储在 pthread 的本地存储中。

我在 Linux 上的多线程程序崩溃了,我想看看当前运行线程的本地存储中存储了什么。

如果我得到指向线程本地存储的指针,我可以使用键来获取存储的数据。

gdb 中是否有命令获取指向线程本地存储的指针

最佳答案

如果您正在调试实时程序,您可以:

print pthread_getspecific(i)

如果您有权访问线程的 pthread_t,您可以:

print ((struct pthread*)pth)->specific[i/32][i%32]

你想要的索引中的 i 和 pth 是 pthread_t。请参阅 glibc 源代码中的 nptl/pthread_getspecific.c。

要在不调用函数的情况下执行此操作,您需要找到 struct pthread。在 x86-64 上,它存储在使用 arch_prctl(ARCH_SET_FS_BASE, ...) 设置的 fs 库中。我不知道如何从 gdb 访问它,但您可以使用 eu-readelf 获取它。运行 eu-readelf --notes core_file 并查看 fs.base 的记录。该数字是 pthread_t 值。 (要弄清楚它是哪一个,您可以将同一记录中的 pid 字段与 gdb 的 info threads 命令中显示的 LWP 进行匹配。)

祝你好运!

关于linux - 来自 linux 核心转储的线程特定数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10841219/

相关文章:

java - 更改文件夹中文件的文件权限

gdb - 如何处理 GDB 中的所有信号

c++ - QNX - 崩溃时未生成核心转储

python - 导入 pyqtgraph 时 python 2.7 中的段错误(核心转储)

c - 释放动态字符串数组时获取核心转储

linux - 在 shell 脚本中使用 sed 尝试替换包含正斜杠的文本时出错

linux - 将整数添加到缓冲区 nasm 的语法

php - 在正在运行的 php 脚本中执行 php 脚本

更改内存中的 'call'地址?

gcc - 计算 GDB 和 LLDB 中的表达式