与此问题中的类似点已在此处和此处提出,并且我知道 Google coredump 库(我已经评估并发现缺少该库,但如果我更好地理解问题,我可能会尝试解决这个问题)。
我想在不中断进程的情况下获取正在运行的 Linux 进程的核心转储。自然的做法是说:
if (!fork()) { abort(); }
由于分叉的进程获得了原始进程内存的固定快照副本,因此我应该获得完整的核心转储,并且由于副本使用写时复制,因此通常应该很便宜。但是,这种方法的一个严重缺点是fork()
只分叉当前线程,而原进程的所有其他线程都不会存在于分叉的副本中。
我的问题是是否有可能以某种方式获得其他原始线程的相关数据。我不完全确定如何解决这个问题,但这里有几个我提出的子问题:
包含所有线程堆栈的内存在分叉进程中是否仍然可用和可访问?
是否可以(快速)枚举原始进程中所有正在运行的线程并存储其堆栈基址的地址?据我了解,Linux上线程堆栈的基础包含一个指向内核线程簿记数据的指针,所以......
使用存储的线程基地址,您能否读出分叉进程中每个原始线程的相关数据?
如果可能的话,也许只需将其他线程的数据附加到核心转储中即可。但是,如果该数据在分叉点已经丢失,那么这种方法似乎没有任何希望。