调试符号文件为调试器提供了从二进制机器代码地址到源代码文本文件代码行的映射.因此有了符号文件,我们才能:

1.      设置断点,因为调试器需要符号文件提供的映射关系,将源代码行的行号转换成对应的机器代码的地址。

2.      查看程序堆栈,简单地说,就是调试器使用映射关系将堆栈里面的地址转换成包含这个地址的函数名。

3.      查看变量的值,对于机器来说,所有的变量都只是一个内存地址,程序在读取变量值的时候,只不过按照变量所属的类型来读取指定大小的内存而已。

4.      甚至调用程序的一些函数,比如原生(Native)程序,经过编译以后,在程序里面实际上只变成了一段机器代码。我们在立即窗口里面调用一个C++函数的时候,调试器需要将函数名翻译成对应的机器代码的起始地址,当然还要遵循一定的函数调用规则才能调用这个函数。

我们一个一个地看符号文件的功能:

查看程序堆栈

将Visual Studio以原生程序(Native)调试模式附加到一个已打开的记事本程序上(附:因为我的系统都是英文版,所以中文菜单都是对着英语直接翻译的,有的会翻译的不准确,所以我会把英文的命令附在后面),然后中断记事本进程的执行 — 通过点击VS菜单里面的“调试(Debug)”-“全部中断(Break All)”。

下面是具体的将VS附加到记事本进程的操作(不好意思,录制的视频太大,不知道怎么传)。

1.      点击Visual Studio里面的“工具(Tools)”-“附加到进程……(Attach to Process …)”。

2.      选择notepad.exe,当然你要保证“附加到… (Attach To…)”文本框里面列出的调试类型是“原生程序(Native)”。

3.      点击确定以后,将Visual Studio附加到刚刚打开的记事本进程。

这个时候打开堆栈(Stack)窗口,你应该会看到类似下面的结果:

上面的堆栈,我也看不懂(我的机器是64位的Windows 7,所以地址都是8个字节的)。因此我们需要一些东西来帮我们把难理解的地址(鸟语)翻译成有意义的文字,这个工作就是由符号文件来完成的。

因为记事本是操作系统自带的程序,我们当然没有办法自己生成它对应的符号文件啦,但是幸运的是,微软早就已经考虑到可能有一些人需要调试Windows内核—例如写驱动程序的程序员,因此微软公司已经将Windows的一些符号文件公开了,公开的地址在:

http://msdl.microsoft.com/download/symbols

在 Visual Studio里使用的方法是:

1.      点击菜单栏里面的“工具(Tools)”—“选项(Options)”。

2.      在“选项(Options)”对话框左边的列表框里面选择“调试(Debugging)”-“符号文件(Symbols)”。

3.      如果你的Visual Studio是Visual Studio 2008 SP 1,那么点击“从微软的符号文件服务器上加载符号文件(Load symbols from Microsoft symbols server)”就可以了。

4.      如果是其他版本-当然是低一些的版本,在右侧的“符号文件路径(Symbol file (.pdb) locations)”列表框里面添加新的一行,将上面的链接输入进去。

然后在“将符号文件缓存到这个文件夹(Cache symbols from symbol servers to this directory:)”文本框里输入你要缓存从服务器下载的符号文件的文件夹路径—毕竟那个服务器是在美国。如下图所示:

5.      点击“确定( OK)”

6.      对于听说英文没有困难的朋友,可以直接参考下面的链接学习如何设置:

http://support.microsoft.com/kb/311503/zh-cn

等待一段很长的时间以后—因为调试器要一个个下载记事本程序所引用到的所有动态链接库文件的符号文件,你应该可以看到类似下面的堆栈信息:

这篇文章的描述里面,我希望你能够明白调试符号文件的重要性:

1.      如果没有调试符号文件,那么就不能查看堆栈—这话好像有点多余。但是很多时候,我们在分析验尸调试所保存的内存文件的时候,第一步要看检查的就是,程序崩溃的时候,堆栈是什么样子的,如果没有调试符号文件,那我们就什么也做不了了。

2.      那么调试符号文件是如何生成的呢?调试符号文件是由编译器生成的,因为编译器负责将文本格式的源代码文件翻译成二进制的程序,所以二者之间的映射关系编译再清楚不过了。每次重新编译的时候,编译器都会生成对应的调试符号文件。

生成调试符号文件的命令:

编程语言

编译器

命令行参数

C#

csc.exe

/debug[:full]

C++/C

cl.exe

/Zi

或者

Link.exe的/debug选项

3.      例如一个客户跟你抱怨程序不能工作,出现了严重的错误(Bug),但是他正在运行的是1.0版本的程序,而你们公司却已经再开发2.0版本的程序了。由于源代码一般都不会给客户,这个时候如果能够找到原始的1.0版本的源代码重新编译,然后安装到客户机重现一下固然是好,但是为什么不直接保存1.0版本的调试符号文件,在调试的时候,直接让调试器自己去找源代码呢?这里涉及到符号文件服务器和源代码文件服务器的合作问题,后面的文章里可能会介绍到。

Visual Studio调试之符号文件相关推荐

  1. 【C++】在 Visual Studio 调试器中指定符号 (.pdb) 和源文件(转载自RSS翻译)

     在 Visual Studio 调试器中指定符号 (.pdb) 和源文件 查找并指定符号文件和源文件:指定符号加载行为.使用符号和源服务器:自动或按需加载符号.  内容 查找符号 (.pdb) ...

  2. Visual Studio调试/加载速度很慢

    本文翻译自:Visual Studio debugging/loading very slow I'm at wits end. 我的智慧结束了. Visual Studio is typically ...

  3. Visual Studio 调试(Dubug)模式下的“未定义标识符”

    原文:https://blog.csdn.net/pijk55556/article/details/60969091 Visual Studio 调试(Dubug)模式下的"未定义标识符& ...

  4. 【备忘】visual studio调试状态下显示lua调用栈

    编辑文件:[VS安装目录]/Common7/Packages/Debugger/autoexp.dat,在文件最后[hresult]之上的空白插入以下代码,就可以在 visual studio调试的时 ...

  5. visual studio 调试时提示 已加载“C:\Windows\SysWOW64\ntdll.dll”。无法查找或打开 PDB 文件。

    问题描述 "Win32Project3.exe"(Win32): 已加载"D:\software\VS2013\VS2013 文档\Win32Project3\Debug ...

  6. Visual Studio调试之断点技巧篇

    不知道能不能算是技巧啦,写出来放到首页贻笑大方而已. 函数断点 在前面的文章Visual Studio调试之避免单步跟踪调试模式里面我讲了如何设置函数断点,说实话,我个人喜欢设置函数断点,而不是在代码 ...

  7. OpenCV图像监视:在Visual Studio调试器中查看内存中图像

    OpenCV图像监视:在Visual Studio调试器中查看内存中图像 图像监视:在Visual Studio调试器中查看内存中图像 先决条件 安装 例子 更多的 图像监视:在Visual Stud ...

  8. 12个Visual Studio调试效率技巧

    在这篇文章中,我们假定读者了解VS基本的调试知识,如: F5 开始使用调试器运行程序 F9 在当前行设置断点 F10 运行到下一个断点处 F5 从被调试的已停止程序恢复执行 F11 步进到函数内(如果 ...

  9. Visual Studio调试之断点基础篇

    原文链接地址:http://www.cnblogs.com/killmyday/archive/2009/09/26/1574311.html 我曾经问过很多人,你一般是怎么调试你的程序的? F9, ...

最新文章

  1. Resources$NotFoundException Resource is not a Drawable (color or path) 问题解决
  2. activeMQ 安装部署文档
  3. 如何出色的研究 RGSS3 (三) 形式的调整的细节
  4. 全球及中国商用壁挂式浴镜行业投资决策与需求前景预测报告2022版
  5. javaWeb项目 IDEA中导入eclipes项目的方法。maven多模块项目(父子模块)与普通的web项目导入
  6. C++ std::condition_variable wait() wait_for() 区别
  7. nssl1519-背包签到题【数论】
  8. 九度 1209:最小邮票数(多重背包)
  9. python必备入门代码-20行python代码的入门级小游戏的详解
  10. java ajax 返回乱码,解决使用$.ajax的时候得到返回乱码
  11. 30个值得推荐的数据可视化工具(2022年最新)
  12. bzoj4199品酒大会
  13. 基于R16标准的5G电力高精度授时解决方案PTP授时方案
  14. 软件测试最容易陷入的28个误区
  15. 【.NET】用Aspose.Words for .NET动态生成word文档中的数据表格
  16. 使用ConnectBot开源项目在android设备上管理你的linux系统
  17. 浅谈provide与inject
  18. 管理员禁止运行此应用的解决办法
  19. Java程序员面试宝典
  20. 微软:现在已不是对 Linux 感情用事的时代(转)

热门文章

  1. [C编码笔记] 空串与NULL是不一样的
  2. Python3入门笔记(1) —— windows安装与运行
  3. IE兼容问题IE6,IE7,IE8,IE9,IE10
  4. MYSQL1130错误的解决方案
  5. esnext:最后一个参数后面也允许加逗号了
  6. 逆向思维--魔兽世界封包分析(1)
  7. Redis存储总用String?你大概错过了更优的使用方法
  8. [Python3网络爬虫开发实战] 1.7.1-Charles的安装
  9. Admin注册和路由分发详解
  10. LindDotNetCore~Mock对实际应用中的意义