C中常用的调试方法、DLL的调试

来源:互联网 发布:apache windows 编译 编辑:程序博客网 时间:2024/05/02 04:43

C中常用的调试方法
 

调试的最常用的方法,假如我们怀疑一个整形变量x有问题的话,可以:
1, CString str;
str.Format(“%d”,x);//和printf非常相似
MessageBox(str);
优点:点确定后程序才会继续运行。
缺点:如果次数太多,过于浪费时间和键盘。
2,Ctrl+F10运行到光标处,在Watch窗口中name项输入x,,后面会显示值。
  优点:简单,可以查看所有的值。
  缺点:无法看到第二次运行到此处的情况。
3,
#ifdef _DEBUG
    afxDump<<x;
#endif
将结果显示在OutPut,不能在Release状态下。Ctrl+F5似乎无效,F5可以。
afxDump.SetDepth(1);
设置深度,如maps,arrays,它只打出有几个可元素,我们用上面的这个函数,它会将所有的内容打出来.
#ifdef _DEBUG
char test[] = "0123456789\n";
afxDump.HexDump( "--", (BYTE*) test, 11, 6 );
#endif
结果为:
-- 30 31 32 33 34 35
-- 36 37 38 39 0A
第一个参数,行首的打头字符.
第二个参数,要打的内容.
第三个参数,要打的元素个数.
第四个参数,每行的个数.
4,TRACE(...), TRACE0, TRACE1, TRACE2, TRACE3 也只能在调试时用注意打字符串时有长度限制,包括结束符在内,不超过512个字符.
5.
OutputDebugString
The OutputDebugString function sends a string to the debugger for display.
VOID OutputDebugString(
LPCTSTR lpOutputString   // string to be displayed
);
6.在Debug状态下
F9设置断点后,F5到下一个断点,F10下一行,F11进入函数(包括系统函数)内部,Shift + F11出来.
F5后,Debug菜单有相应的菜单项.
F5后,View->Debug Window的子菜单项比较有用.
Watch   查看你指定的变量
variables 显示auot变量,local变量,this的值
memory   显示指定内存地址存储的值
call stack 显示函数调用关系
registers 寄存器的值
Disabblemble   汇编代码
其实Release下也可调试F5
Alt + f7 工程设置
c\c++ Generate Browse info 选上.
    Debug info 选 Progame database for edit and continue
Link   Generate debug info 选上
    Link incrementally 选上
--------------------------------------------------------------------------------

DLL的调试

假设:
  要调试hook.dll hook.h hook.lib
1。建立一个新工程Test,将hook整个工程目录拷贝到Test目录下
2。在Test工程中需要用到hook.dll的源文件中(或stdafx.h中)加入
  #include ".\hook\hook.h"
  这样在该源文件中使用"::"就可以索引到hook.h中所有的导出函数、变量以及类
 
3。在Test的工程设置->Link->Object/library modules中加入
  ./hook/debug/hook.lib
4。编译连接好Test之后,发现未找到hook.dll. 这需要设置path.
  可以在工程设置->Debug->Working directory中加入
  e:\Test\hook\debug   也可以在autoexe.bat中设置路径
5。通过工程->Insert Project into Workspace将hook.dsp工程加入Test项目中。
6。设置hook工程为活动工程,在工程>Debug>Executable for Debug session中加入:
  e:\test\debug\test.exe
7。现在设置断点,按F5可以正常调试了
注意:当调试的DLL被映射到其他的应用程序(非TEST)进程空间并运行时,在该DLL中设置的断点无效,当然可以通过MessageBox来查看变量,若该DLL是MFC扩展DLL,则还可以用TRACE或afxDump来查看变量。

0 0
原创粉丝点击