【发布时间】:2013-08-28 12:57:14
【问题描述】:
在here 和here 之前已经提出了与此问题中的类似点,并且我知道 Google coredump 库(我已经评估并发现缺少该库,尽管我可能会尝试并继续工作如果我能更好地理解问题)。
我想在不中断进程的情况下获取正在运行的 Linux 进程的核心转储。自然的做法是:
if (!fork()) { abort(); }
由于分叉的进程得到原始进程内存的固定快照副本,我应该得到一个完整的核心转储,并且由于副本使用写时复制,它通常应该很便宜。但是,这种方法的一个严重缺点是fork() 只分叉当前线程,而原进程的所有其他线程都不会存在于分叉的副本中。
我的问题是是否有可能以某种方式获得其他原始线程的相关数据。我不完全确定如何解决这个问题,但这里有几个我想出的子问题:
包含所有线程堆栈的内存在派生进程中是否仍然可用和可访问?
是否可以(快速)枚举原始进程中所有正在运行的线程并存储其堆栈基址的地址?据我了解,Linux 上线程堆栈的基础包含一个指向内核线程簿记数据的指针,所以...
有了存储的线程基地址,你能读出分叉进程中每个原始线程的相关数据吗?
如果可能的话,也许只需将其他线程的数据附加到核心转储中即可。但是,如果该数据在分叉点已经丢失,那么这种方法似乎没有任何希望。
【问题讨论】:
-
我现在没有 pthreads 中的任何枚举功能... - 但关于
fork()ing,您可能想看看pthread_atfork()。似乎使用后者注册的处理程序可以用来滚动自己的 pthread-enumerator。 -
可能只fork当前线程的原因是Linux中线程的实现,使用
clone()。 -
@Marcus:我并不真正担心 为什么
fork()的行为方式。我对它的功能感到非常满意,这对我来说似乎很理智。 -
This article 关于 IBM 的 Java 使用 fork+signal 生成核心转储说他们正在使用
/proc/PID/maps中的信息来检索“否则不会存在”的信息。
标签: c++ c linux pthreads coredump