Advanced Debugging
About AdvDbg Consult Train Services Products Tools Community Contact  
欢迎光临 高端调试 登录 | 注册 | FAQ
 
  ACPI调试
Linux内核调试
Windows内核调试
 
  调试战役
调试原理
新工具观察
 
  Linux
Windows Vista
Windows
 
  Linux驱动
WDF
WDM
 
  PCI Express
PCI/PCI-X
USB
无线通信协议
 
  64位CPU
ARM
IA-32
  CPU Info Center
 
  ACPI标准
系统认证
Desktop
服务器
 
  Embedded Linux
嵌入式开发工具
VxWorks
WinCE
嵌入式Windows
 
  格蠹调试套件(GDK)
  格蠹学院
  小朱书店
  老雷的微博
  《软件调试》
  《格蠹汇编》
  《软件调试(第二版)》
沪ICP备11027180号-1

C/C++本地代码调试

帖子发起人: ^_^   发起时间: 2009-07-25 19:54 下午   回复: 3

Print Search
帖子排序:    
   2009-07-25, 19:54 下午
suds 离线,最后访问时间: 2009/7/25 19:49:21 ^_^

发帖数前500位
注册: 2009-07-25
发 贴: 1
出现1st_chance_Process_Shut_Down的dmp文件,但是如何知道process是如何被shutdown的呢?
Reply Quote
用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了之类的!
非常之感谢!


IP 地址: 已记录   报告
   2009-07-26, 17:04 下午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: 出现1st_chance_Process_Shut_Down的dmp文件,但是如何知道process是如何被shutdown的呢?
Reply Quote

如果是被人从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的栈回溯中看到的一样。

 


IP 地址: 已记录   报告
   2009-07-27, 00:44 上午
irp 离线,最后访问时间: 2010/3/8 23:15:26 johnl

发帖数前150位
注册: 2008-09-29
发 贴: 9
Re: 出现1st_chance_Process_Shut_Down的dmp文件,但是如何知道process是如何被shutdown的呢?
Reply Quote
检查自己程序是不是有地方调用了TerminateProcess()。
IP 地址: 已记录   报告
   2009-07-29, 10:51 上午
aeezguo 离线,最后访问时间: 2010/4/21 7:25:59 guozf

发帖数前10位
男
注册: 2008-12-06
HK
发 贴: 68
Re: 出现1st_chance_Process_Shut_Down的dmp文件,但是如何知道process是如何被shutdown的呢?
Reply Quote
我也碰到类似的问题,一个process突然消失,我将Windbg设置为Postmortem debugger。但是Windbg在process消失的时候并没有被invoke.

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

期待可以找到解决方案或者原因
IP 地址: 已记录   报告
高端调试 » 软件调试 » C/C++本地代码调试 » Re: 出现1st_chance_Process_Shut_Down的dmp文件,但是如何知道process是如何被shutdown的呢?

 
Legal Notice Privacy Statement Corporate Governance Corporate Governance
(C)2004-2020 ADVDBG.ORG All Rights Reserved.