初次使用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++程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MFC用代码创建工具栏
- 下一篇: Win32 像素格式描述符学习