1. 如何Debug一个进程的子进程?
答: 使用WinDBG attach到父进程, 然后输入命令".childdbg 1"(无引号). 这样子进程在刚刚被加载的时候, WinDBG就Attach上去了. 这两个进程的debug session都在一个WinDBG的窗口里, 如果想要切换当前进程, 可以使用命令"|"来查看所有的进程, 使用"|0s"来切换到ID为0的进程, 以此类推.
2. 如何在进程刚刚加载的时候, 就使用Debugger attach上去?
答: 使用GFlags. 参考资料的文章里有详细的介绍. 这里贴出原文的两张图, 以及一些要点, 所见即所得.
3. 我使用上面的方法成功attach了进程, 可是当我试图定义CLR断点的时候却遇到下面的提示. 如果我继续执行, 不等我按break, 我想查看的函数已经执行过了. 请问该怎么办?
1:027> !bpmd Microsoft.Office.Server.Search.dll Microsoft.Office.Server.Search.Administration.NotesWebServiceWrapper.NotesDataClass.GetDatabase
Failed to find runtime DLL (mscorwks.dll), 0x80004005
Extension commands need mscorwks.dll in order to have something to do.
答: 上面的提示之所以显示是因为在我们break掉此进程的时候, CLR还没有被加载起来, 所以, CLR debugger extension的命令还无法执行.
这个时候, 可以运行下面的命令, 来在CLR加载刚刚结束的时候, 就停下来给我们定义断点的机会.
bp mscorwks!EEStartup "g @$ra"
注意这里的"g @$ra"的意思是"继续执行直到返回地址被发现". 这里的@符号的意思是告诉debugger, 该符号后面跟随的是一个寄存器或者伪寄存器, 如果没有这个符号, 该命令执行会很慢, 因为debugger会搜索整个符号表.
参考资料
================
How to debug a process as soon as it starts with WinDbg or Visual Studio 2010
Advanced .Net Debugging with SOS Extension in Visual Studio - FAQ