Q:WinDBG的Watch窗口中我想要查看长字符串,但是后面的内容都被省略为...了怎么办?

A:如图,双击你要查看的内容,出现光标后,移动光标即可查看后面被省略的内容

Q:WinDBG如何给程序设置命令行参数?

A:如图,第一行是参数名(是我的一个用来测试的HTML文件名),第二行是参数所在的位置(也就是该HTML文件所在的目录)

另外,第二行也代表程序运行时所在的目录。什么意思呢?

下载demo

比如说,在调试运行上面那个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)

点此下载zthreaddemo_debug项目文件夹

Windows调试神器:WinDBG的更多相关文章

  1. 关于内核调试(Windbg)的虚拟机配置问题

    注:本文配置 环境为VMware® Workstation11.1.2 build-2780323+Windows xp SP2+Windbg 6.12.0002.63 x86 *在win7以后的操作 ...

  2. 第二章排错的工具:调试器Windbg(上)

    感谢博主 http://book.51cto.com/art/200711/59731.htm <Windows用户态程序高效排错>第二章主要介绍用户态调试相关的知识和工具.本文主要讲了排 ...

  3. 【转】段错误调试神器 - Core Dump详解

    from:http://www.embeddedlinux.org.cn/html/jishuzixun/201307/08-2594.html 段错误调试神器 - Core Dump详解 来源:互联 ...

  4. Eruda 一个被人遗忘的调试神器

    Eruda 一个被人遗忘的调试神器 引言   日常工作中再牛逼的大佬都不敢说自己的代码是完全没有问题的,既然有问题,那就也就有调试,说到调试工具,大家可能对于 fiddler.Charles.chro ...

  5. 读书笔记|Windows 调试原理学习|持续更新

    关于调试方面的学习笔记,主要来源于<软件调试>的读书笔记和梦织未来论坛的视频教程 1.调试器使用一个死循环监听调试信息. DebugActiveProcess(PID);while(TRU ...

  6. eruda手机端调试神器

    在日常的移动端开发时,一般都是试用chrome浏览器的移动端模式进行开发和调试,如果想在手机上能和浏览器一样看控制台调试就更加完美了: 一个手机端调试神器eruda是一个专为手机网页前端设计的调试面板 ...

  7. 移动端调试神器vconsole,手机端网页的调试工具Eruda

    移动端调试神器vconsole,手机端网页的调试工具Eruda 移动端中使用 vConsole调试 移动端调试工具vconsole安装Git地址:https://github.com/WechatFE ...

  8. 移动端真机debug调试神器 vConsole学习(一)之基础

    参考 使用方法 移动端真机debug调试神器 vConsole的引入说明(原生态与WebPack) 移动端使用vconsole调试console vConsole ——开源的前端 console 调试 ...

  9. Vue开发调试神器 vue-devtools

    Vue开发调试神器: vue-devtools 1. 下载Chrome扩展插件GitHub下载地址: https://github.com/vuejs/vue-devtools 建议使用npm淘宝镜像 ...

随机推荐

  1. ELK集群模式部署

    架构拓扑图为: 准备工作: 下载资源包: Elasticsearch: wget https://artifacts.elastic.co/downloads/elasticsearch/elasti ...

  2. c++ opencv3.4 保存和读取PCA模型

    cv::PCA pca(samples, cv::Mat(), cv::PCA::DATA_AS_ROW,); FileStorage fs("pca.xml",FileStora ...

  3. [转]Git branching and tagging best practices

    Git branching and tagging best practices I am currently learning to use Git by reading Pro Git. Righ ...

  4. android开发笔记之Volley (1)

    1. volley的简介 Volley is an HTTP library that makes networking for Android apps easier and most import ...

  5. java实现快速排序算法

    1.算法概念. 快速排序(Quicksort)是对冒泡排序的一种改进.由C. A. R. Hoare在1962年提出.2.算法思想. 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据 ...

  6. 解决Xcode 6 编译Cocos2d-x iOS项目失败

    在Xcode 6 beta里编译Cocos2d-x iOS项目时可能会失败,提示如下错误: Undefined symbols for architecture i386: "_fwrite ...

  7. 总结this指向问题

    在全局上下文中,this指向全局. 在函数内部,this的值取决于函数被调用的方式. 当函数简单调用时(函数在全局上下文中),this指向window(严格模式下指向undefined) call 或 ...

  8. iOS 调用音乐播放以及视频播放器

    音乐播放 NSString *path = [[NSBundle mainBundle] pathForResource:@"预谋" ofType:@"mp3" ...

  9. Openerp开发进销存系统总结

    转自 :http://blog.sina.com.cn/s/blog_7cb52fa80101ngt8.html 差不多用了2个星期的闲余事件,对于openerp v7.0进行了学习和应用开发.细节总 ...

  10. 01-spring-专题IOC

    接口: 1,用于沟通的中介物的抽象化 2,实体把自己提供给外界的一种抽象化说明,用以内部操作分离出外部沟通方法,使其能被修改内部而不影响外界其他实体与其交互的方式(内部可能修改了,但是接口不变). 简 ...