Re: 出现1st_chance_Process_Shut_Down的dmp文件,但是如何知道process是如何被shutdown的呢?

C/C++本地代码调试

出现1st_chance_Process_Shut_Down的dmp文件,但是如何知道process是如何被shutdown的呢?


^_^ 2009-07-25, 19:54 下午
用adplus监视一个process,发现总是无规律的产生1st_chance_Process_Shut_Down的dmp文件。用windbg查看dmp文件,发现始终只有一个thread,而且从这个thread的call stack里面看不到有用的信息。
例如:
0:000> kv
ChildEBP RetAddr  Args to Child             
00000000 00000000 00000000 00000000 00000000 ntdll!KiUserApcDispatcher
或者
ChildEBP RetAddr  Args to Child             
034be998 7c822124 77e6bad8 00000650 00000000 ntdll!KiFastSystemCallRet (FPO: [0,0,0])
034be99c 77e6bad8 00000650 00000000 00000000 ntdll!NtWaitForSingleObject+0xc (FPO: [3,0,0])
034bea0c 77e6ba42 00000650 ffffffff 00000000 kernel32!WaitForSingleObjectEx+0xac (FPO: [Non-Fpo])
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for iceutil32.dll -
034bea20 00343343 00000650 ffffffff 77960404 kernel32!WaitForSingleObject+0x12 (FPO: [Non-Fpo])
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for ice32.dll -
WARNING: Stack unwind information not available. Following frames may be wrong.
034bea6c 0068b48a 779604a6 02903314 00000000 iceutil32!IceUtil::Cond::dowait+0x43
这个线程做的事情看起来一定不会引起process shutdown.

请问如何能从crash dmp中找到更多的信息来确定这个process是如何shutdown 的,例如被人从task manager里面kill了之类的!
非常之感谢!

Re: 出现1st_chance_Process_Shut_Down的dmp文件,但是如何知道process是如何被shutdown的呢?


格蠹老雷 2009-07-26, 17:04 下午

如果是被人从TaskMgr杀掉的,那么便很难从被杀进程的用户态DUMP文件中找到线索。正像用户态栈中所显示的,普通线程大都数时候都是在等待,此时线程实际上是在内核态的,大多时候是在睡觉。这时有人要杀它,其实也就是调用TerminateProcess API,对应的也就是NtTerminateProcess内核服务。这个内核服务检查权限没有问题后,就开始下手了,清理这个进程了,也就是说用户态的代码根本没机会执行,在“睡梦”中就结束使命了。

下面是TaskMgr在执行杀进程动作时的过程:

0:000> kvn
 # ChildEBP RetAddr  Args to Child             
00 0007f694 0100c22c 000000a0 00000001 000a07b6 kernel32!TerminateProcess (FPO: [2,0,0])
01 0007f6d0 0100ceef 00001630 00000000 00330728 taskmgr!CProcPage::KillProcess+0xaf (FPO: [2,8,0])
02 0007f6e4 0100d1d0 000003f2 000a07b6 0007f7b8 taskmgr!CProcPage::HandleWMCOMMAND+0x40 (FPO: [2,0,4])
03 0007f750 7e418724 00330728 00000111 000003f2 taskmgr!ProcPageProc+0x249 (FPO: [4,20,4])

其中a0是被杀进程的进程句柄,1是所谓的退出代码:

BOOL WINAPI TerminateProcess(
  __in  HANDLE hProcess,
  __in  UINT uExitCode
);

就连这个退出代码,在用户态的转储中也看不到。如果是在收到进程退出事件时通过内核会话来看进程的EPROCESS结构,那么可以看到这个ExitCode,保存在ExitStatus字段中:

lkd> dt _EPROCESS 89a04da0  -y exit
nt!_EPROCESS
   +0x078 ExitTime : _LARGE_INTEGER 0x1ca0dcb`bdf5b880
   +0x24c ExitStatus : 1

可以看到,与从TaskMgr的栈回溯中看到的一样。

 

Re: 出现1st_chance_Process_Shut_Down的dmp文件,但是如何知道process是如何被shutdown的呢?


johnl 2009-07-27, 00:44 上午
检查自己程序是不是有地方调用了TerminateProcess()。

Re: 出现1st_chance_Process_Shut_Down的dmp文件,但是如何知道process是如何被shutdown的呢?


guozf 2009-07-29, 10:51 上午
我也碰到类似的问题,一个process突然消失,我将Windbg设置为Postmortem debugger。但是Windbg在process消失的时候并没有被invoke.

怀疑可能是类似taskmgr调用TerminateProcess()杀掉process,或者在程序中某个位置调用TerminateProcess(),但是很难找到原因.

期待可以找到解决方案或者原因

Powered by Community Server Powered by CnForums.Net