分享

Windows应用程序调试方法

 无云666 2014-02-27

编写的程序有可能出现异常,结果与预想的有差异等情况,这时就需要调试程序,下面列出一些调试的方法(仅限本地调试方法)。

启动调试器

常用的启动调试器的方法自不说。现说一下在没有源代码,或不允许停止应用程序的情况下调试的方法: 启动应用程序,然后启动visual studio,打开工程,选择“调试”中的“附加到进程”,如下图(示例图都是英文版的)

 

果希望停止调试,但是不想停止应用程序的运行,可以选择“调试”中的“全部分离”,如下图

 

设置断点

断点设置在visual studio调试中最常用到的方法。最通常的方法不必说。下面介绍些你可能不曾用到,但有时是非常方便的方法

设置函数断点

我们可以在函数内的指定位置添加断点。方法是选择“调试->新建断点->在函数处中断,然后会弹出如下对话框:

 

输入函数名和行号即可,注意填写的是空白行和注释行的行号,会自动调整为代码行的行号

    如果想在动态链接库的导出函数上加断点,如果已经加载了符号文件,则需要按照 _funcname@param*4格式来写。例如要在LoadLibraryW上添加断点,可以如下写:_LoadLibraryW@4;如果没有加载符号文件,需要设置加载DLL导出(如下图),然后在文本框输入导出函数名。例如:LoadLibraryW 这种情况下没有函数前的下划线和后面的参数。

 

设置数据断点

当希望某个变量变化时中断或某个地址变化时中断,可以设置数据断点。启动程序后,中断程序,然后在断点窗口选择新建,选择新建数据断点(如下图),弹出如下对话框:

 

 

输入一个地址或地址表达式,选择字节计数和语言,注意是地址,所以如果是看某个成员变量是否变化,记得加“&

数据断点变化实际上是指定内存的变化,如果输入的变量的地址发生变化,该断点将不代表该变量的变化。

设置断点中断条件

当在指定代码上设置了断点,可以进一步设置中断条件和断点命中次数,方法是在断点窗口,选择该断点,点击右键,在右键菜单中选择相应项

 

 

 

 

 

在条件表达式中需要注意:只能使用C类型的比较运算符;不能调用函数;不能包含宏。不过可以使用伪寄存器。下面列出一些伪寄存器。 

@ERR  最后一个错误值,GetLastError返回的值

@TIB   线程信息块地址。可以用来指定线程条件。

@CLK 时钟寄存器

@EAX @EBX @ECX @EDX @ESI @EDI @EIP @ESP @EBP @EFL    Intel CPU寄存器

@CS @DS @ES @SS @FS @GS   Intel CPU段寄存器

@ST0 @ST1 @ST2 @ST3 @ST4 @ST5 @ST6 @ST7  Intel CPU浮点寄存器

 

 

从堆栈窗口设置断点

在堆栈窗口,在中断模式下,右击函数调用,然后从快捷菜单断点子菜单中选择插入断点断点符号出现在函数调用名称旁的左边距中

 

通过代码设置断点

   在代码中也可以设置断点,使用DebugBreak()函数可以抛出一个中断异常。这样可以用代码来控制各种中断条件。

设置跟踪点

有的时候我们只是想跟踪代码运行,希望运行到代码某些位置后可以输出信息而不是中断程序执行,这时候可以设置跟踪点。方法是在代码行右键选择断点、插入跟踪点。弹出一个对话框设置命中断点条件后的输出信息。代码左侧会显示一个菱形的跟踪点标记。

 

设置地址断点

当希望在没有源代码的地方加断点,比如CreateProcess函数的入口加断点,可以设置地址断点,不过需要先找到该函数的入口地址,这可以通过反汇编代码(在调试菜单的窗口子菜单中打开反汇编代码的窗口)找到。找到后,在该汇编代码处右键单击代码行,在弹出菜单中选择断点,插入断点。

 

服务程序调试

由于服务程序本身是由系统启动,所以不能采用visual studio直接启动调试,也不能采用进程绑定的方法。需要在服务进程启动的时候自动启动调试器,具体设置方法如下:

打开注册表,定位到HKEY_LOCAL_MACHINE/Software/Microsoft/Windows NT/currentversion/image file execution options下。

新建项,命名为服务程序的名字,例如MyService.exe。在该项下新建字符串类型的键,命名为debugger,键值为vsjitdebugger.exe。关闭注册表。如下图:

 

配置服务程序启动用户,使用登录用户启动服务。否则以localsystem启动的服务程序打开的调试器无法显示窗口。

配置完成,当启动服务的时候就会自动启动调试器,需要注意的是服务在启动时有时间限制,不要让调试器中断时间过长。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多