Windbg的使用

调试进程

例程、工程名为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列数字,这代表栈的帧,可以指定当前帧,查看栈的局部变量

猜你喜欢

转载自blog.csdn.net/u013404885/article/details/127468392