在分析 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/