.Net应用程序调试之设置断点

在软件调试过程中,断点功能至关重要,想像一下,如果没有断点功能,那么当我们需要查看特定函数的执行情况时,该是多么的困难。

.Net应用程序虽然是在执行过程中将中间代码编译成本地代码,也就是说如果中间代码未被编译成本地代码之前,我们无法用bp 命令来设置断点,而我们又很难知道中间代码何时被编译成本地代码,看似是一个很困难的任务,但所幸Windbg.exe 的插件SOS.dll 与SOSex.dll提供了一些有用的扩展命令来帮助我们完成该任务。

先来看SOS.dll提供的BPMD 命令的应用

!BPMD命令格式如下所示:

0:004> !help bpmd
-------------------------------------------------------------------------------
!BPMD [-nofuturemodule] <module name> <method name>
!BPMD -md <MethodDesc>
!BPMD -list
!BPMD -clear <pending breakpoint number>
!BPMD -clearall


从以上可知BPMD支持通过函数名或函数地址来设置断言

其中值得注意有以下2点:

1:若通过!BPMD [-nofuturemodule] <module name> <method name> 来设置断点,则需要在<method name> 包含命名空间,如下例所示

!BPMD ConsoleApplication TEST.CTest.Hello

其中TEST为命名空间

2:若断点设置的函数若未被编译成本地代码,BPMD 将会在收到该断点函数被编译成本地代码时设置断点,同时如果要设置断点的函数所在的模块未被加载,则应该加上-nofuturemodule选项以通知BPDM 模块可能没有被加载

另外sosex.dll里提供了一个特别有用的断点设置函数,可以通过指定源代码行号来设置断点,命令格式为:

!sosex.mbp <source file> <line number> [column number> [Options] "command"

其中各字段功能如下所示:

1:source file 源代码名
2:line number 行号
3:column number 列号
4: Options 可选参数:
/1 设置一次断点
/p:n 在跳过n次后设置断点  /p:3表示在第3次执行到该处代码时设置断点
5:/t:n :在指定的线程断点
6:"command"  断点触发时所执行的命令






2013-05-08




cuiweican