写个简单C++程序;运行如下;
#include "stdafx.h"
#include
using namespace std;
class Student{
public:
char *name;
int age;
float score;
void say(){
cout<
我想通过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,可看到类的三个成员变量如下图;先到这里;