Visual Studio调试的符文件

前面在免克设置断点的反省手续和Visual Studio调试之切点上阶篇论及了调节符号文件及其作用,这首稿子我将介绍调试符号文件的片于是法,如果您就充分熟稔调试文件的语句,尽可以跳了本文。

调剂符号文件呢调试器提供了自二进制机器代码地址及源代码文本文件替代码行的映射.因此发生矣号文件,我们才能够:

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)窗口,你应当会盼类似下面的结果:
C++ 1

上面的堆栈,我吗扣不知底(我之机器是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:)”文本框C++里输入你要是缓存从服务器下载的号子文件的文本夹路径—毕竟特别服务器是以美国。如下图所示:

C++ 25.       点击“确定( OK)”

6.       对于传闻英文没有困难的情人,可以一直参考下面的链接学习怎样设置:

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

等一段落很丰富之岁月过后—因为调试器要一个个下载记事本程序所引用到之兼具动态链接库文件之符文件,你当可以看看类似下面的堆栈信息:
C++ 3

当时篇稿子的叙说中,我期望而会明白调试符号文件之第一:

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本的调试符号文件,在调试之时节,直接为调试器自己失去找源代码呢?这里提到到号文件服务器和源代码文件服务器的搭档问题,后面的稿子里可能会见介绍及。