Debug相关的一些小技巧

1. 如何Debug一个进程的子进程?

答: 使用WinDBG attach到父进程, 然后输入命令".childdbg 1"(无引号). 这样子进程在刚刚被加载的时候, WinDBG就Attach上去了. 这两个进程的debug session都在一个WinDBG的窗口里, 如果想要切换当前进程, 可以使用命令"|"来查看所有的进程, 使用"|0s"来切换到ID为0的进程, 以此类推.

 

2. 如何在进程刚刚加载的时候, 就使用Debugger attach上去?

答: 使用GFlags. 参考资料的文章里有详细的介绍. 这里贴出原文的两张图, 以及一些要点, 所见即所得.

image

 

image

 

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

http://bugslasher.net/2011/03/26/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

http://netinverse.com/devblogs/debugging/advanced-net-debugging-with-sos-extension-in-visual-studio-faq/415/

posted on 2012-10-17 10:31  中道学友  阅读(1285)  评论(0编辑  收藏  举报

导航

技术追求准确,态度积极向上