Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 我是否可以转储正在阻止磁盘活动的进程(最好是在不终止它的情况下)?_Linux_Cpu Registers_Coredump - Fatal编程技术网

Linux 我是否可以转储正在阻止磁盘活动的进程(最好是在不终止它的情况下)?

Linux 我是否可以转储正在阻止磁盘活动的进程(最好是在不终止它的情况下)?,linux,cpu-registers,coredump,Linux,Cpu Registers,Coredump,我想转储正在运行的进程的核心,根据/proc//status,该进程当前正在阻止磁盘上的活动。事实上,它正忙于在GPU上工作(应该是4个小时的工作,但现在要花更长的时间)。我想知道这个进程已经完成了多少工作,所以最好能够转储进程的内存。然而,据我所知,“磁盘上的阻塞活动”意味着不可能以任何方式中断进程,而coredumping进程(例如使用gdb)需要中断并暂时停止进程,以便通过ptrace进行连接,对吗 我知道我可以将/proc/{maps,mem}作为根来读取(可能不一致)内存状态,但我不知

我想转储正在运行的进程的核心,根据
/proc//status
,该进程当前正在阻止磁盘上的活动。事实上,它正忙于在GPU上工作(应该是4个小时的工作,但现在要花更长的时间)。我想知道这个进程已经完成了多少工作,所以最好能够转储进程的内存。然而,据我所知,“磁盘上的阻塞活动”意味着不可能以任何方式中断进程,而coredumping进程(例如使用gdb)需要中断并暂时停止进程,以便通过ptrace进行连接,对吗


我知道我可以将
/proc/{maps,mem}
作为根来读取(可能不一致)内存状态,但我不知道如何获取进程的用户空间CPU寄存器值。。。当进程在内核中时,它们保持不变,对吗?

您可能可以在程序上运行
gcore
。它基本上是一个围绕GDB的包装器,可以附加、使用
gcore
命令,然后再次分离


这可能会中断IO(好像它收到了一个信号,它会),但如果写入正确,您的程序可能会重新启动它(在任何情况下,由于默认处理,这都可能发生)

您可以在源代码中每半小时添加一次寄存器打印……当然,我更乐意看到一个现成的解决方案,而不是不得不推出自己的coredump maker(@0x90是的,但我希望能够对已经运行的程序执行此操作,因为我不希望通过强制重新启动而丢失约9小时的计算数据,也不希望等待未知的时间来完成此操作(如果它没有卡在某处)。此外,“每半小时”不会这样做–在输入一个可能(或将)在“磁盘IO”上阻塞较长时间的方法之前,您必须始终这样做作为旁注,我只是用一个简单的hello world类型的程序尝试了这个方法。调用
read()
自动恢复。太酷了!你能在回答中发布消息来源吗?@Jessemon:对于hello world?它基本上是
char c;printf(“Hi!\n”);读取(0,&c,1)
正如我所说,没有什么好办法。在我的情况下,这不起作用,我已经尝试过gcore。进程处于不可中断的睡眠状态。@thejh:Ack,在那种情况下,好吧,没有办法。GDB会想停止进程,这将不得不等到睡眠完成。(顺便说一句,让内核将用户任务置于不间断睡眠状态通常不是一个好主意,但我认为您对此无能为力。)