初次使用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,可看到类的三个成员变量如下图;先到这里;

经验分享 程序员 微信小程序 职场和发展