关于PDB与EXE/DLL 文件的匹配问题(转)

转载 2011年01月12日 16:53:00

原文:http://blogold.chinaunix.net/u/8681/showart_2217695.html

关于PDB与EXE/DLL 文件的匹配问题

1. 静态检查
windbg 调试工具包中有一个工具symchk.exe, 选项很多, 下面一个简单的用法可以检查一个 test.exe能不能找到与它匹配的PDB:


这是成功的情形. 下面来个失败的作为对比:

2. 如果已经在windbg内部, 可以通过下面的命令检查


最后一行说 MATCH, 肯定没问题.

3. 在windbg中(在VS中不行), 如果你100%确信源代码没有任何改动, 只不过被重新编译了一下.
可以通过 .symopt +40 来关闭对GUID的强行检查. 从而load一个不匹配的PDB.

4. 除了1中提到的工具, 还有一个叫chkmatch 的工具, 在
http://www.debuginfo.com/download/chkmatch.zip
可以下载, 该工具不仅可以检查是否匹配, 还可以把不匹配的强制改为匹配, 也就是说EXE/DLL和PDB中的GUID相同, 这样在VS中就可以使用了, 当然, 高度危险, 后果自负.

5. 在VS中的空心圆

我同事把那种设置了断点之后, 没有设置成功, 出现的红色圆圈叫做空心圆问题.

此类问题有两个可能的原因:
(A) 的确PDB不匹配
(B) 时机还不到, 有些源文件对应的module本身还没有被load, 对应的PDB更不会被load了.
(C) 代码被优化掉了

对于(B)的情况, 在windbg中也同样会出现断点貌似设置不对的情况.

对于是(A)还是(B)的判断, 在VS中, 可以打开Module 窗口, 这个窗口对诊断此类问题很有帮助. 在Debug菜单下, 有些VS2005 安装之后, 在DEBUG菜单下找不到这个菜单项, 不要惊慌, 它只是没出现在菜单项而已, 通过tools-customize可以找回它.

这个Module窗口中, 清楚地列出当前被调试的进程中, 有哪些module, 每个module的pdb 情况, 你还可以手工load一个module对应的symbol文件, 可以查看symbol文件的细节.

在这个窗口中, 一个可能会令你迷惑的地方是: 对于mixed module, 它会被列出两次, 一次为native, 一次为.NET

6 关于5中的(C)的情况, 代码被优化掉了, 有几个应对办法:

(I) 如果可以, 重新编译, 关闭优化, 我个人的经验和习惯是, 永远不打开优化, 除非: 有证据表明某处有性能问题, 或在为RISC CPU写程序, 此类指令集的性能高度依赖于是否优化.

(II) 对于.NET 程序, 你尽早会碰到即使关闭了编译优化, 也仍然被提示说不能evaluate 表达式, 或断点设不上的问题, 这是另一种优化. JIT, 关闭它可以通过以下一个不广为人知的办法:
若模句是 test.exe
在它同一目录下, 产生一个test.ini的文件. 内容固定如下:
[.NET Framework Debugging Control]
GenerateTrackingInfo=1
AllowOptimize=0

这会禁用JIT优化, 条件是, 下次启动程序时才会生效.

7. bash脚本(cygwin下测试通过) 得到GUID

# $1: exe/dll/pdb file
# $2: the target string
# $#: the offset of guid to $2
function get_guid()
{
    exe_fname="$1"
    guid_mark_string=$2
    guid_offset=$3
    regex="$(echo -n $guid_mark_string | od -t x1 | sed 's/[^ /t]* /?//;s/ ///n/g')"
    byte_offset=$(od -v -t x1 $exe_fname | sed 's/[^ /t]* /?//;s/ //n/g; /^$/d' | 
        grep -b -P "$regex" | head -1 | sed 's/:.*//')
    od -v -t x1 -j $((byte_offset/3+ guid_offset)) $exe_fname -N 16 |
    head -1 | sed 's/[^ /t]* //'
}

function get_guid_from_module()
{
    get_guid $1 "RSDS" 4
}

function get_guid_from_pdb()
{
    get_guid $1 "/LinkInfo" -20 
}

vs2010下使用dmp文件和pdb文件调试时dump、exe和pdb三个文件要保持版本一致的原因

一、pdb文件简介 英文:Program Data Base,即程序的基本数据,是VS编译链接时生成的文件。 pdb文件主要存储了如下调试信息: (1)public, private,和stat...
  • itworld123
  • itworld123
  • 2018年01月15日 11:18
  • 58

C#解析DLL————反射

前段时间敲代码,需要动态的加载的外部DLL,并且解析DLL,来读取DLL中的类,属性,有时候还需要读取特性的值。这个问题刚开始遇到,是一点想法没有,以前没有这么用过,后来查资料,请教别人,终于有了结果...
  • wangyongxia921
  • wangyongxia921
  • 2015年01月31日 23:32
  • 5075

无法找到调试信息,或者调试信息不匹配,cannot find or open the pdb file

今天测试组跑程序crash了,拿回了crash.dmp文件 dmp文件放到开发目录下,用vs 打开调试,提示“无法找到调试信息,或者调试信息不匹配,cannot find or open the p...
  • sepnineth
  • sepnineth
  • 2013年05月28日 13:29
  • 4200

错误 1error LNK1207 PDB 格式不兼容;请删除并重新生成

最近遇到一个问题。在实验室用vs2005作了作业,打包带回来之后,用vs2013打开,然后就出现了如下错误。 错误 1 error LNK1207: “F:\vsproject\project\课本...
  • qq_34174814
  • qq_34174814
  • 2016年05月11日 18:49
  • 8007

VS2013 项目无法调试 调试信息不匹配

晚上调试程序时遇到一个问题,项目无法调试。 按Ctrl+F5启动调试时,会提示项目无法调试:无法找到“xxx.exe”的调试信息,或者调试信息不匹配。未使用调试信息生成二进制文件。   尝试了多种...
  • AmyZhang1994
  • AmyZhang1994
  • 2016年12月15日 19:04
  • 2660

vs2012远程调试提示pdb不匹配

1.  在使用VS2012远程调试时,在本地会出现提示pdb文件对对应,问是否加载,此时可以不用管,在调试时,选择模块,在对应的模块中,右键选择符号加载即可,或者是手工加载...
  • xjf44xjf
  • xjf44xjf
  • 2014年01月15日 22:20
  • 550

使用VS2012调试Dump文件

前一节我讲了怎么设置C++崩溃时生成Dump文件 , 点击 传送门 , 这一节我讲讲怎么使用 VS2012 调试生成的 Dump 文件 , 甚至可以精确到出错的那一行代码上面 ;1. 生成 Dump ...
  • tojohnonly
  • tojohnonly
  • 2017年06月05日 10:24
  • 1981

未能找到文件"bin\Release\******.exe/pdb"

未能找到文件"bin\Release\******.exe/pdb
  • pengzhen8805
  • pengzhen8805
  • 2013年12月24日 15:00
  • 934

The RSDS pdb format

by Jeremy Gordon - This file describes the format of the pdb (Program Database) files of the "RS...
  • zzz3265
  • zzz3265
  • 2012年05月21日 16:50
  • 2384

vc++调试---利用PDB和dump文件定位问题并进行调试(VS2010)

如何得到PDB 二、 选中取消即可会出现如下: 即可得到如下所示:...
  • woshizfs
  • woshizfs
  • 2015年03月29日 21:36
  • 1984
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于PDB与EXE/DLL 文件的匹配问题(转)
举报原因:
原因补充:

(最多只允许输入30个字)