有没有办法在gdb核心转储中获取线程的开始时间

Posted

技术标签:

【中文标题】有没有办法在gdb核心转储中获取线程的开始时间【英文标题】:is there any way to get the start time of the thread in gdb core dump 【发布时间】:2020-09-03 16:25:38 【问题描述】:

我正在尝试在 Linux 核心转储中查找最旧的线程。所以我需要获取每个正在运行的线程的开始时间。那么有什么方法可以获取线程的开始时间。

我尝试了 gdb 核心文件中的一些命令,但它给出了每个线程调用堆栈但没有启动时间。

问候 拉比

【问题讨论】:

【参考方案1】:

我正在尝试在 Linux 核心转储中查找最旧的线程。所以我需要获取每个正在运行的线程的开始时间。

你的结论与你之前的陈述不一致。

那么有什么办法可以得到线程的开始时间。

否:线程结构中的任何地方都没有记录该时间。

然而,一般Linux 以递增的顺序分配线程 id,因此按线程 id 排序应该会给你想要的顺序。例如:

(gdb) info thread
  Id   Target Id                           Frame 
* 1    Thread 0x7fa91e769740 (LWP 2128629) __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
  2    Thread 0x7fa91d766700 (LWP 2128632) 0x0000557aa5787165 in fn ()
  3    Thread 0x7fa91af61700 (LWP 2128637) 0x0000557aa5787165 in fn ()
  4    Thread 0x7fa91df67700 (LWP 2128631) 0x0000557aa5787165 in fn ()
  5    Thread 0x7fa91cf65700 (LWP 2128633) 0x0000557aa5787165 in fn ()
  6    Thread 0x7fa91bf63700 (LWP 2128635) 0x0000557aa5787165 in fn ()
  7    Thread 0x7fa91c764700 (LWP 2128634) 0x0000557aa5787165 in fn ()
  8    Thread 0x7fa91a760700 (LWP 2128638) 0x0000557aa5787165 in fn ()
  9    Thread 0x7fa91b762700 (LWP 2128636) 0x0000557aa5787165 in fn ()
  10   Thread 0x7fa919f5f700 (LWP 2128639) 0x0000557aa5787165 in fn ()

在这里你可以看到线程 1 是首先创建的,然后是线程 4、2、5、7 等(LWP 是这里的 Linux 线程 id)。

【讨论】:

以上是关于有没有办法在gdb核心转储中获取线程的开始时间的主要内容,如果未能解决你的问题,请参考以下文章

gdb 调试远程核心转储

gdb 搜索核心转储内存

在核心转储文件上使用 gdb 获取变量的值

如何获取详细的 valgrind 核心或使用 gdb 将调试附加到核心在启动时转储的进程?

有没有办法用 Xcode 打开(任意)核心转储?

从核心转储中获取堆栈跟踪