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

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

初次使用Windbg调试简单C++程序_第1张图片

#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* 命令设置符号文件路径;没有调试符号文件也先不管,没有这个可能只是有的系统的东西看不到;

初次使用Windbg调试简单C++程序_第2张图片

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

初次使用Windbg调试简单C++程序_第3张图片 

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

初次使用Windbg调试简单C++程序_第4张图片 

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

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

初次使用Windbg调试简单C++程序_第5张图片 

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

初次使用Windbg调试简单C++程序_第6张图片 

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

初次使用Windbg调试简单C++程序_第7张图片 

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

初次使用Windbg调试简单C++程序_第8张图片 

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

初次使用Windbg调试简单C++程序_第9张图片 

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

初次使用Windbg调试简单C++程序_第10张图片 

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

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

初次使用Windbg调试简单C++程序_第11张图片 

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

初次使用Windbg调试简单C++程序_第12张图片 

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

初次使用Windbg调试简单C++程序_第13张图片 

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

初次使用Windbg调试简单C++程序_第14张图片 

1

初次使用Windbg调试简单C++程序_第15张图片 

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

初次使用Windbg调试简单C++程序_第16张图片 

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

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

初次使用Windbg调试简单C++程序_第17张图片 

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

初次使用Windbg调试简单C++程序_第18张图片 

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

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

初次使用Windbg调试简单C++程序_第19张图片 

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

初次使用Windbg调试简单C++程序_第20张图片 

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

初次使用Windbg调试简单C++程序_第21张图片 

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

初次使用Windbg调试简单C++程序_第22张图片 

 

你可能感兴趣的:(VC++,汇编语言,c++,windbg,dt,bp)