Windows调试神器:WinDBG
Q:WinDBG的Watch窗口中我想要查看长字符串,但是后面的内容都被省略为...了怎么办?
A:如图,双击你要查看的内容,出现光标后,移动光标即可查看后面被省略的内容

Q:WinDBG如何给程序设置命令行参数?
A:如图,第一行是参数名(是我的一个用来测试的HTML文件名),第二行是参数所在的位置(也就是该HTML文件所在的目录)
另外,第二行也代表程序运行时所在的目录。什么意思呢?
比如说,在调试运行上面那个demo的时候,你把第一行留空(不给任何参数),但是第二行设置为c:\myfolder
你就会发现程序生成的文件在c:\myfolder之下,这就好像你打开了cmd,切换到c:\myfolder,然后再运行这个程序一样的效果

---------------------------------------------------------------------------------------
最开始一直在撸JAVA,最近处于巩固基础和拓宽知识面的目的翻出了久违的C艹研究。习惯性的用IDE,要么CODEBLOCKS,要么VS.
过了一段时间,最明显的感觉就是,IDE用多了很多细节不清楚,而这些细节往往是最关键的知识,关系到你能不能从根本上明白程序的本质或者完成一些顽固BUG的修复,而IDE往往会把这些东西给你屏蔽掉(出于方便和自动化的考虑),如果你不知道这些被屏蔽掉的细节,那么你往往在构建程序的时候经常看到IDE报一大堆ERROR的时候不知所措
反正,我是终于明白了IDE不适合新手的原因。
在UNIX或者类UNIX系统下有GNU MAKE+GCC+GDB作为命令行编译和调试的工具,个人喜欢称之为3G套装
那么Windows下难道就只能依赖VS或者CODEBLOCKS+MinGW了么,况且CODEBLOCKS+MinGW本质上也就是3G套装。在Windows下开发一些东西的时候还是要MS自家的工具才吃得开
经过前段时间的学习,大概学习了一些MS家的NMAKE以及CL还有LINK的基本用法,见这篇随笔
今天上网搜了搜,发现了神器WinDBG,终于不用在需要DEBUG的时候打开笨重的VS了!新技能GET!MS套装GET!(=,='''逗比。。。)
点此下载教学PPT(我从百度文库下载下来修改了一些微小的错误并上传到我的网盘)
代码,main.cpp:
#include <stdlib.h>
#include <stdio.h> char *getcharBuffer();
void changeto4p(char* buffer); int main()
{
system("pause");
char *str = getcharBuffer();
changeto4p(str);
printf("%s",str);
return ;
} char *getcharBuffer()
{
return "6969,3p3p";
} void changeto4p(char* buffer)
{
while (*buffer) {
if (*buffer == '') {
*buffer = '';
}
++buffer;
}
}
显然,上面的代码在changeto4p中尝试修改read only的memory区域(25行),因此会发生Access violation error
首先,如果要调试你的代码,那么你在编译的时候要给compiler还有linker都加上debug选项,这样调试信息(symbol,line number等等)才会保留下来给DEBUGGER
见Makefile:
# compiler
CC = cl
# linker
LINK = link
# libraries
LIB =
7 # headers
HEADER_PATH = /I include
# options
EHSC = /EHsc
COMPILATION_ONLY = /c
C_OUT = /Fo:
L_OUT = /OUT:
# compiler & linker debug option, to disable debug, replace '/Zi' & '/DEBUG' with empty strings
C_DEBUG = /Zi
L_DEBUG = /DEBUG
# targets
bin\test.exe: bin obj obj\main.obj
$(LINK) $(L_DEBUG) $(OBJ_PATH) $(L_OUT)bin\test.exe obj\main.obj obj\main.obj:
$(CC) $(C_DEBUG) $(EHSC) $(HEADER_PATH) $(COMPILATION_ONLY) src\main.cpp $(C_OUT)obj\main.obj # folders obj:
mkdir obj bin:
mkdir bin # clean
# bin, obj folders and pdb files .PHONY: clean
clean:
-rmdir /s /q bin
-rmdir /s /q obj
-del *.pdb
我由于不是很会玩Makefile,所以DEBUG选项的添加或者删除都是通过手工修改Makefile实现的。见第14行。至于CL和LINK的各个选项的含义,在MSDN可以找到,就不赘述了。
(说实话我觉得更好的办法是一个target叫release,另一个叫debug,需要debug的时候就输入nmake debug,所有的obj、exe、pdb文件都放到debug\obj,debug\bin,debug\pdb三个文件夹中,需要clean的时候就输入nmake clean,nmake就直接生成release版本的obj和bin文件夹,改天研究研究该怎么写这个Makefile)
打开命令行,输入nmake生成了demo\vc120.pdb, demo\bin\test.exe、demo\bin\test.pdb
这里的vc120.pdb test.pdb就是调试信息文件(Program Debug Database file),WinDBG用这些文件找到源代码的位置和行号还有符号的位置以及其他信息
打开WinDBG
第一步,选择File>Symbol File Path,设置pdb文件的位置为demo\bin,因为test.pdb在这个位置
第二步,选择File>Source File Path,设置源代码文件的位置为demo\src,因为main.cpp在这个位置
第三步,选择File>Open Executable,打开test.exe
你会发现main.cpp也被打开了(WinDBG根据test.pdb找到了main.cpp的位置)
第四步,打断点,快捷键为F9(命令为bp <代码所在行的二进制地址>),我选择给changeto4p这个函数打上一个断点
第五步,开始调试,快捷键为F5(命令为g,也就是go的意思,你也可以选择按面板上的按钮,如下图,基本的功能有:Go, Restart, Stop debugging, Break, Step into, Step over, Step out, Run to cursor, Insert or remove breakpoint, Command, Watch, Locals, Registers, Memory window, Call stack, Disassembly, etc)说白了就是(继续运行,重新调试,停止调试,暂停,单步指令(跳入,跳过,跳出,运行到光标处),插入删除断点,命令窗口,变量观察窗口,局部变量观察窗口,寄存器观察窗口,主存观察窗口,调用栈,汇编代码窗口等等),你也可以从View选项中找到这些功能。
对应的快捷键可以打开WinDBG去查看,我这里就不手打了,撸不动,简单说一下,F10是单步step over,F11是单步step into,跟VS里面一样

第六步,运行到changeto4p的时候,打开Watch窗口,输入*buffer,你会发现如下图所示,这里的值是0n57 '9',什么意思呢?0n的意思是十进制(类似0x表示十六进制,0开头表示八进制),0n57 '9'的意思就是字符'9'的ASCII码是十进制的57,说白了就是*buffer的值是字符'9'。值得一提的是,这里Watch窗口的name列不仅可以写变量名,也可以写合法的c++表达式,反正指针操作、结构体操作是可以作为合法表达式写到name这一栏的,我估计简单的算术表达式也是可以的,可以试试看。
另外:你可以选择View>Locals查看局部变量,直接就能看到buffer字符串的所有值,可以试试。
对于WinDBG初步的学习就到这里。下面还会补充一些更进一步的例子。

附上zthreaddemo_debug的调试界面截图,步骤跟上面一样哦,试试吧!(注意,就算你设置了Source file path,WinDBG也不会自动去帮你打开cpp文件,所以在开始调试之前把需要的cpp文件打开,然后打上断点!)
我修改了Makefile从而编译的时候会保留调试信息,生成pdb文件(在Makefile中搜索L_DEBUG和C_DEBUG)

Windows调试神器:WinDBG的更多相关文章
- 关于内核调试(Windbg)的虚拟机配置问题
注:本文配置 环境为VMware® Workstation11.1.2 build-2780323+Windows xp SP2+Windbg 6.12.0002.63 x86 *在win7以后的操作 ...
- 第二章排错的工具:调试器Windbg(上)
感谢博主 http://book.51cto.com/art/200711/59731.htm <Windows用户态程序高效排错>第二章主要介绍用户态调试相关的知识和工具.本文主要讲了排 ...
- 【转】段错误调试神器 - Core Dump详解
from:http://www.embeddedlinux.org.cn/html/jishuzixun/201307/08-2594.html 段错误调试神器 - Core Dump详解 来源:互联 ...
- Eruda 一个被人遗忘的调试神器
Eruda 一个被人遗忘的调试神器 引言 日常工作中再牛逼的大佬都不敢说自己的代码是完全没有问题的,既然有问题,那就也就有调试,说到调试工具,大家可能对于 fiddler.Charles.chro ...
- 读书笔记|Windows 调试原理学习|持续更新
关于调试方面的学习笔记,主要来源于<软件调试>的读书笔记和梦织未来论坛的视频教程 1.调试器使用一个死循环监听调试信息. DebugActiveProcess(PID);while(TRU ...
- eruda手机端调试神器
在日常的移动端开发时,一般都是试用chrome浏览器的移动端模式进行开发和调试,如果想在手机上能和浏览器一样看控制台调试就更加完美了: 一个手机端调试神器eruda是一个专为手机网页前端设计的调试面板 ...
- 移动端调试神器vconsole,手机端网页的调试工具Eruda
移动端调试神器vconsole,手机端网页的调试工具Eruda 移动端中使用 vConsole调试 移动端调试工具vconsole安装Git地址:https://github.com/WechatFE ...
- 移动端真机debug调试神器 vConsole学习(一)之基础
参考 使用方法 移动端真机debug调试神器 vConsole的引入说明(原生态与WebPack) 移动端使用vconsole调试console vConsole ——开源的前端 console 调试 ...
- Vue开发调试神器 vue-devtools
Vue开发调试神器: vue-devtools 1. 下载Chrome扩展插件GitHub下载地址: https://github.com/vuejs/vue-devtools 建议使用npm淘宝镜像 ...
随机推荐
- 万里长征第二步——django个人博客(第七步 ——上传文件)
在项目目录下新建一个 ‘uploads’文件夹以保存上传的文件 配置setting.py文件 MEDIA_URL = '/uploads/' MEDIA_ROOT = os.path.join(BAS ...
- Atom 有什么优秀插件?
蓝色 ,主业三流青春校园小说作家兼反差萌段子手… 韦易笑等 130 人赞同 若是C / C++的话,我推荐ATOM的这几个插件主要用于代码补全,实时语法检测,以及代码格式调整,其实就是Clang的那一 ...
- 关于TagHelper的那些事情——Microsoft.AspNet.Mvc.TagHelpers介绍
写在开始 在上一篇文章中,简单介绍了什么是TagHelper,怎么使用它.接下来我会简单介绍一下微软随着ASP.NET5一起发布的TagHelpers.它们分别是: AnchorTagHelper C ...
- 在MySQL中使用子查询和标量子查询的基本用法
一.MySQL 子查询 子查询是将一个 SELECT 语句的查询结果作为中间结果,供另一个 SQL 语句调用.MySQL 支持 SQL 标准要求的所有子查询格式和操作,也扩展了特有的几种特性.子查询没 ...
- Spark2-对于Null/Nan的处理
一.几种查找空值的方法 1.Column方法 column.isNull/column.isNotNull/column.isNaN 2.类sql方法 二.na方法 2.1 na.drop方法 2.1 ...
- 【读书笔记】iOS-GCD-block-后台执行
当一个app按home键退出的时候.仅仅有最多5秒的时间做一些保存或清理资源的工作. 可是调用beginBackgroundTaskWithExpirationHandler方法,能够最多有10分时间 ...
- jsp el 自定义方法 tld 说明
使用 el 的过程中,需要使用到后端代码处理逻辑,这个时候我们就需要自定义 方法. 如我们后端代码定义如下: package com.rhythmk.common; public class FncH ...
- [Algorithms] Build a Binary Tree in JavaScript and Several Traversal Algorithms
A binary tree is a tree where each node may only have up to two children. These children are stored ...
- jQuery选取表单元素
表单元素选择器 选择器 说明 :button <button>元素和type属性值为button的<input& ...
- android源代码分析 android toast使用具体解释 toast自己定义
在安卓开发过程中.toast使我们常常使用的一个类.当我们须要向用户传达一些信息,可是不须要和用户交互时,该方式就是一种十分恰当的途径. 我们习惯了这样使用toast:Toast.makeText(C ...