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
}

http://blackjazz07.blog.163.com/blog/static/16249081820129311077569/

【转】匹配dll(exe)和pdb方法的更多相关文章

  1. Visual Studio 不生成.vshost.exe和.pdb文件的方法【转】

    Visual Studio 不生成.vshost.exe和.pdb文件的方法[转] 使用Visual Studio编译工程时,默认设置下,即使选择了「Release」时也会生成扩展名为「.vshost ...

  2. Visual Studio 不生成.vshost.exe和.pdb文件的方法

    使用Visual Studio编译工程时,默认设置下,即使选择了「Release」时也会生成扩展名为「.vshost.exe」和「.pdb」的文件. 一.先解释一下各个文件的作用: .pdb文件: 程 ...

  3. Visual Studio 编译Winform程序不生成.vshost.exe和.pdb文件的方法

    问题:使用Visual Studio编译工程时,默认设置下,即使选择了「Release」时也会生成扩展名为「.vshost.exe」和「.pdb」的文件. 先解释一下各个文件的作用: .pdb文件: ...

  4. VS2010中配置C#Project不生成.vhost.exe和.pdb文件的方法

    在VS2010中编译C#工程时,在C#的Project的属性界面的Build选项卡中当Configuration : Relese 时,依然会生成扩展名为.vhost.exe和.pdb文件. 其中.p ...

  5. C#Project不生成.vhost.exe和.pdb文件的方法

    编译C#工程时,在C#的Project的属性界面的Build选项卡中当Configuration : Relese 时,依然会生成扩展名为.vhost.exe和.pdb文件. 其中.pdb是debug ...

  6. 启动 Eclipse 弹出“Failed to load the JNI shared library jvm.dll”错误的解决方法!&&在eclipse.ini中为eclipse指定jdk启动

    参考:http://blog.csdn.net/zyz511919766/article/details/7442633 http://blog.sina.com.cn/s/blog_028f0c1c ...

  7. C++调用DLL有两种方法——静态调用和动态调用

    C++调用DLL有两种方法——静态调用和动态调用 标签: dllc++winapinullc 2011-09-09 09:49 11609人阅读 评论(0) 收藏 举报  分类: cpp(30)  [ ...

  8. python2在安装pywin32后出现ImportError: DLL load failed 解决方法

    python2在安装pywin32后出现ImportError: DLL load failed 解决方法 在python2中有时候会出现: import win32api   ImportError ...

  9. Linux的.a、.so和.o文件 windows下obj,lib,dll,exe的关系

    Linux的.a..so和.o文件 - chlele0105的专栏 - CSDN博客 https://blog.csdn.net/chlele0105/article/details/23691147 ...

随机推荐

  1. java 中 String 类的几个问题

    首先,我们要搞清楚,在java中,引用和基本数据类型是存储在栈中的.而对象是存储在堆中的. 只有一个例外,就是String对象. 例如: String str1="test"; S ...

  2. 词法分析器flex的使用

    词法分析器flex的功能说起来就是一句话,将正则表达式转化为c代码. flex编译成功后会生成一个flex.exe的可执行文件.此时,我们需要一个定义了正则表达式 动作的input文件.例如test. ...

  3. linux源码阅读笔记 jmpi指令(转)

    jmpi是段间跳转指令,用于x86实模式下, 如:BOOTSEG = 0x0c70 jmpi    4, #BOOTSEG 假如当前段CS==00h,那么执行此指令后将跳转到段CS==0x0c70,当 ...

  4. 国产神通数据库操作备忘(Linux)

    最近接触到国产神通数据库的一个项目,发现这个数据库还是挺有技术含量的,看起来做的还不错. 1.启动停止 在终端窗口中输入以下命令启动数据库: # /etc/init.d/oscardb_<数据库 ...

  5. Class

    1. No const constructor Unlike other member functions, constructors may not be declared as const . W ...

  6. lintcode :continuous subarray sum 连续子数组之和

    题目 连续子数组求和 给定一个整数数组,请找出一个连续子数组,使得该子数组的和最大.输出答案时,请分别返回第一个数字和最后一个数字的值.(如果两个相同的答案,请返回其中任意一个) 样例 给定 [-3, ...

  7. Java学习笔记之:Java的变量

    一.介绍 在Java语言中,所有的变量在使用前必须声明.声明变量的基本格式如下: type identifier [ = value][, identifier [= value] ...] ; 格式 ...

  8. SQLite数据库的体系结构(翻译自sqlite.org)

    $1 简介    本文档描述了SQLite库的体系结构,这些信息对那些想理解和修改SQLite的内部工作机制的人是有用的.    下图显示了SQLite的主要组成部件及其相互关系,下面的内容将描述每一 ...

  9. spring 定时任务的 执行时间设置规则(转)

     spring 定时任务的 执行时间设置规则 单纯针对时间的设置规则org.springframework.scheduling.quartz.CronTriggerBean允许你更精确地控制任务的运 ...

  10. C++:类的成员函数定义方式

    1.成员函数的第一种定义方式:在类声明中只给出成员函数的原型,而将成员函数的定义 放在类的外部. 返回值类型 类名::成员函数名(参数表) {      函数体  } class Point{ pub ...