调试进程
例程、工程名为Test,程序包含一个不可写的bug。
#include "stdlib.h"
#include "stdio.h"
const char* GetCharBuffer()
{
return "3E3E";
}
void Change(char* buffer)
{
while (*buffer)
{
if (*buffer == '3')
*buffer = '4';
buffer++;
}
}
int main()
{
printf("%s\n", "any key continue...");
getchar();
const char* str = GetCharBuffer();
Change((char *)str);
printf("%s", str);
return 0;
}
选择一个进程运行(Ctrl + E):
设置符号文件路径(Ctrl + S):
进程加载后会暂停,等待输入。
命令:x (检查符号)
示例:x Test!GetCharBuffer
会输出函数符号在内存中的地址,然后就可以利用这个地址给函数打断点了
命令:bp(打断点)
示例:bp 00021800 (也可以直接bp Test!GetCharBuffer)
可以通过打开源文件(Ctrl + O)看断点已经打上了(下图红色的部分就是断点了)
命令:g(开始执行进程)
可以看到程序已暂停在断点处了, 按F10(逐过程)或F11(逐语句)就可以调试了.
命令:bc(取消断点)
示例:bc 0(取消第0个断点)
可以看到断点已取消
这时按F5让继续执行,可以看到程序出现异常
出现异常的汇编码 mov byte ptr [exa],34h ,意思是移动一个字节的字符'4'(34h的ASCII码)移动到eax寄存器指向的内存中。
这时可以输入x看局部变量,或者打开局部变量窗口查看局部变量,两者都一样
我们也可以查看[eax]指向的内存是什么
从源代码来看,程序也停在了出问题的那一行
命令:k(查看调用栈)
也可以打开调用栈窗口
命令:.frame(切换帧)
示例:.frame 1(切换到第1帧)
我们可以看到栈信息的最前面有1列数字,这代表栈的帧,可以指定当前帧,查看栈的局部变量