VC++利⽤PDB和dump⽂件定位问题并进⾏调试
⼀、什么是PDB⽂件
1. PDB⽂件是"程序数据库" Program Data Base的简称,包含的程序的代码信息
2.通过这个⽂件我们可以查看对应断电的位置,堆栈信息等内容
3.使⽤PDB使得我们⽆需代码也可以掌握程序的堆栈运⾏状态
⼆、PDB⽂件
1.由链接器⾃动⽣成
2.⽂件由两部分构成,私有符号数据(private symbol data )和公共符号表(public symbol data)
私有符号数据(Private Symbol Data)
函数
全局变量
局部变量
⽤户定义的结构体,类,数据类型
源⽂件的名称和源⽂件中每个⼆进制指令的⾏号
公共符号表(Public Symbol Table)
静态变量
全局变量(external)
三、如何得到PDB⽂件
程序编译之后会在Debug或者是Release⽬录下⽣成*.pdb⽂件
四、什么是dump⽂件
dump⽂件是附加堆栈信息的存储⽂件的简称,⽂件扩展名“.dmp”,通过dump⽂件我们可以得到程序运⾏某⼀时刻的堆栈数据。
当我们程序意外崩溃后,通常程序会⽴即中断运⾏,此时我们⽣成这⼀时刻的dump⽂件就可以通过此时的堆栈进⾏分析,到崩溃的代码并分析原因。
当程序遇到未处理异常(主要指⾮指针造成)导致程序崩溃死,如果在异常发⽣之前调⽤了SetUnhandledExceptionFilter()函数,异常交给函数处理。
MSDN中描述为:
Issuing SetUnhandledExceptionFilter replaces the existing top-level exception filter for all existing and all future threads in the calling process.
因⽽,在程序开始处增加SetUnhandledExceptionFilter()函数,并在函数中利⽤适当的⽅法⽣成Dump⽂件,即可实现需要的功能。
Dump⽂件是进程的内存镜像。可以把程序的执⾏状态通过调试器保存到dump⽂件中。
五、EXE、DLL等与pdb⽂件的匹配
调试器是如何来判别EXE、DLL等是否和⼀个pdb⽂件匹配呢?pdb文件阅读器安卓
每次我们链接EXE或者DLL或者SYS的时候,链接器都将产⽣⼀个唯⼀的GUID,然后将其写⼊到PDB和可执⾏⽂件。调试器加载的时候将检查两者的GUID,如果⼀致就表⽰他们匹配。
注:如果我们需要调试,我们需要查dmp⽂件,那么请妥善保管好⾃⼰的代码和pdb。每次重新编译,即使所有代码均没有变化,他们的GUID也不同。
六、编译器产⽣符号的过程
如果指定⽣成调试信息,编译器在每次编译完⽂件以后就会产⽣⼀个obj⽂件,然后同时产⽣它对应的调试信息。当我们进⾏连接的时候,编译器就会帮我们把所有obj统⼀编译为⼀个可执⾏⽂件,然后所有的调试信息统⼀⽣成⼀个PDB⽂件。
七、Release程序⽣成pdb⽂件
⽤VS调试Release的程序,发现⽆法调试。其实,并不是Release的程序不能调试,⽽是没有让Release的程序⽣成pdb⽂件,VS⽆法加载pdb⽂件⽽⽆法调试程序。
设置⼀下,让Release的程序也⽣成pdb⽂件,就好了。
⼋、本地dump调试
直接⽤VS打开Test.dmp⽂件,测试时dmp⽂件是本地产⽣的,因此VS会依据dmp⽂件⾃⾏到exe,pdb和源代码的路径。因此直接点击调试,程序会出错代码⾏中
断
⼗、⽆源代码dump调试
但若dmp⽂件是exe在另⼀台机器上产⽣的,则我们最好把exe,pdb,dmp放到同⼀⽂件夹下,必须保证pdb与出问题的exe是同⼀时间⽣成的,⽤VS打开dmp⽂件后还需要设置符号表⽂件路径和源代码路径。
(1)当把pdb⽂件与dmp⽂件放⼊同⼀⽬录下时,就不需设置其路径,否则需要设置
⼯具->选项->调试->符号:
属性->调试源代码:
这样点击“使⽤仅限本机进⾏调试”,即可在出错代码⾏中断: WinDbg调试
基本思路与VS⼀致,winDbg会提供更为全⾯的调试信息
(1)设置pdb路径:File ->Symbol File Path
(2)设置exe路径:File -> Image File Path
(3)设置源代码路径:File -> Source File Path(指sln所在⽬录)
(4)打开dmp⽂件:File ->Open Crash Dump
(5)执⾏命令 !analyze –v
可以得出详细的异常分析
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论