欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

初次使用Windbg调试简单C++程序

发布时间:2025/4/14 46 豆豆
生活随笔 收集整理的这篇文章主要介绍了 初次使用Windbg调试简单C++程序 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

写个简单C++程序;运行如下;

#include "stdafx.h" #include <iostream> using namespace std;class Student{ public:char *name;int age;float score;void say(){cout<<name<<"的年龄是"<<age<<",成绩是"<<score<<endl;} };int _tmain(int argc, _TCHAR* argv[]) {Student stu;stu.name = "小明";stu.age = 15;stu.score = 92.5f;stu.say();system("pause");return 0; }

我想通过Windbg来查看一下stu.xxx的值的情况;

从 文件 菜单选择 打开可执行文件;打开前面的exe;先不管release或debug版;

打开以后自己停留在下图,出来一个 int 3;这应是停在程序开始处;还未执行第一条指令;

也可以输入 .sympath srv* 命令设置符号文件路径;没有调试符号文件也先不管,没有这个可能只是有的系统的东西看不到;

lm可以查看模块;自己写的部分是一个模块,还有VC的模块和Windows的模块,如下图;

 

输入g执行;直接就运行到了末尾;这时调试器无法输入命令,显示BUSY,如下图底部状态栏;

 

我想中断在 system("pause"); 这句;看下图,

最后一句的地址应是 778d182c,不知道后面的c20800是什么,

 

重新装载程序;输入 bp 778d182c,在此地址设置一个断点;

 

然后输入 g 执行,直接就运行到了下图;出来了 按任意键继续...,这是由system("pause") 产生的,没有中断在 system("pause") 这句;

 

重新装载程序;往前移动一段,bp 778d1800;

 

g 执行,也是直接到了末尾;

 

再往前设置断点,bp 778d1000,还是直接到了末尾;不知道怎么找一个地址来设置断点;

 

每个模块前面显示2个地址;估计一个是开始地址,一个是结束地址;尝试在自己的模块的结束地址 01014000 设置断点;g 一下,显示出错如下,不能在此地址设置断点;

这是设置指令的断点;还可以设置内存地址等的断点;

 

重新装载程序;输入 pc ,这是执行一个函数;一个个函数往下走;

 

走了好一会也没到达自己写的代码;然后尝试在00ff0000设置断点,这是自己模块的开始地址;也是不能在此地址设置断点;

 

重新装载程序,使用 p 50,这是执行50条指令;

 

1

 

输入 p 5,p 3,估摸着往下走,看是否会停留在system("pause");这句;

 

也是直接到了最后;程序窗口出现 按任意键继续...,调试器显示BUSY;

以为调试器此时不能操作;原来,在windbg的调试菜单中,选择 断点 菜单,会在当前位置插入一个 int 3;int 3应该是设置一个软件断点;

 

然后调试器可以操作了;dt 命令是查看变量或结构体;输入 dt stu,想看一下stu变量;显示没找到stu;

 

再输入 模块名!stu ,也没找到;

输入 模块名!* ,显示此模块的所有符号,

 

在里面找一下看有没有stu;没有;找到类名Student,如下图;

 

再找,又找到Student::say函数; stu变量没发现;

 

输入 dt 模块名!Student,可看到类的三个成员变量如下图;先到这里;

 

 

总结

以上是生活随笔为你收集整理的初次使用Windbg调试简单C++程序的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。