最近我写个例子程序研究下某个异常情况,故意制造了个崩溃。然后分析dmp文件。

当我执行!address -summary命令想观察下进程当前内存情况时,去报如下错误:

0:000> !address -summary

No symbols for ntdll. Cannot continue.

这意思是没有ntdll.dll模块的符号,不可能啊,因为有明显的证据证明该模块符号文件已经加载且匹配,如下:

1、比如我们从线程栈可以佐证

05 00affa24 7799662d 008e7000 808b6aa4 00000000 kernel32!BaseThreadInitThunk+0x19 (FPO: [Non-Fpo])
06 00affa80 779965fd ffffffff 779b51e4 00000000 ntdll!__RtlUserThreadStart+0x2f (FPO: [SEH])
07 00affa90 00000000 00da1091 008e7000 00000000 ntdll!_RtlUserThreadStart+0x1b (FPO: [Non-Fpo])
只有加载了对应符号文件,才能看到这个正确的函数名。

2、执行!chksym ntdll

0:000> !chksym ntdll

ntdll.dll
    Timestamp: 6071CF9D
  SizeOfImage: 19C000
          pdb: wntdll.pdb
      pdb sig: F9EA7A7F-4120-6C21-D2ED-4E99993A9EF4
          age: 1

Loaded pdb is f:\debug_symbol\symbols32\wntdll.pdb\F9EA7A7F41206C21D2ED4E99993A9EF41\wntdll.pdb

wntdll.pdb
      pdb sig: F9EA7A7F-4120-6C21-D2ED-4E99993A9EF4
          age: 1

MATCH: wntdll.pdb and ntdll.dll
这条指令很明确的告诉我,不仅仅加载了,且是匹配的

可是为什么会报“No symbols for ntdll. Cannot continue.

在网上查了很多资料都没有什么帮助,后来在某篇文章上看到:该作者遇到了符号的其他问题,他得出结论说windbg的系统模块符号文件路径要设置为c:\symbols就解决了他面临的问题。

我想,我姑且也这样试试,于是我将我的符号路径改成如下:

然后,结果真的可以了,!address -summary命令正确执行和输出了。这是真的吗,真的是因为路径问题,真的是要c:\symbols吗?

根据我个人的经验,不太相信这个结论。我做了如下的验证步骤:

1、我注意到我原来的目录是两层的,会不会是因为这个原因呢,我将我原来的目录F:\Debug_Symbol\Symbols32调整为F:\Symbols32,执行相同命令,结果是报相同错误。

2、先删除现在c:\symbols目录,然后将我原来的符号目录考到c:盘,改名为symbols。然后执行!address -summary命令,我等待奇迹的出现,结果却是:

0:000> !address -summary

No symbols for ntdll. Cannot continue.

然后我懵逼了,但至少得出这样一个结论c:\symbols目录解决我了我的问题。然后继续折腾,结果在某次折腾里,我忘了修改windbg符号路径设置,但是目录下的相关符号被我移到了其他目录,也就是说F:\Debug_Symbol\Symbols32是空的,当调试时,ntdll.dll模块的符号文件是从微软符号服务器上拿的新的符号文件,也就是说问题的原因不在于目录而在于符号问见本身。

观察下两个符号文件:

原来的符号文件

这是新的,也是不出问题的符号文件

可以看到,这两个文件的的guid是一样的,但文件大小不一样,也就是说对应的版本还是不一样,旧的符号文件跟我系统里的ntdll其实是不匹配的。可是guid都一样,为什么不是正确的匹配版本呢。我懵逼了。

但是我们可以得出几点经验:

  • windbg告诉你符号文件匹配,但是那是不一定的
  • 以后遇到同样的问题,我们可以试着把原来所谓匹配的符号文件删除,然后执行同样的操作让windbg从新下载符号文件,可能会解决

其实,这种情况还会引发其他指令无法执行,比如:

  • !teb
    0:000> !teb
    TEB at 008ea000
    error InitTypeRead( TEB )...
  • !heap
    0:000> !heap
    Invalid type information

后续我会继续研究这个问题,同时希望看到此文的其他人,能帮我解答。

关于windbg报错"No symbols for ntdll. Cannot continue."问题的更多相关文章

  1. oc调用c++接口时 报错 Undefined symbols for architecture i386:

    当在oc中调用c++中的方法时,发现说c++中的方法没定义或是找不到 Undefined symbols for architecture i386: "_desTYData", ...

  2. 微信SDK导入报错 Undefined symbols for architecture i386:"operator delete[](void*)", referenced from:

    异常信息: Undefined symbols for architecture i386:  "operator delete[](void*)", referenced fro ...

  3. ios unit test 工程选择release时候报错Undefined symbols for architecture i386

    Undefined symbols for architecture i386: "_OBJC_CLASS_$_ItemReturn", referenced from: objc ...

  4. xcode编译运行报错纪录(持续更新)

    ---恢复内容开始--- 1. Undefined symbols for architecture i386: "_deflate", referenced from: -[NS ...

  5. 解决Undefined symbols for architecture x86_64: 报错 和 ld: warning: ld: warning: ignoring file警告

    出现这种错误的情况: 用iphone5模拟器编译程序正常, 用iphone5s以上的模拟器编译出现Undefined symbols for architecture x86_64: 报错 和 ld: ...

  6. WinDbg抓取程序报错dump文件的方法

    程序崩溃的两种主要现象: a. 程序在运行中的时候,突然弹出错误窗口,然后点错误窗口的确定时,程序直接关闭 例如: “应用程序错误” “C++错误之类的窗口” “程序无响应” “假死”等 此种崩溃特点 ...

  7. Qt Creator无法debug,报错:The selected debugger may be inappropriate for the inferior. Examining symbols and setting breakpoints by file name and line number may fail. The inferior is in the Portable ...

    看到这个报错我是绝望的 解决:下载windows sdk  win10 sdk 只安装Debugging Tools for Windows 打开 工具-选项-Kits 安装sdk成功后我们可以看到 ...

  8. iOS开发编译报错、常见问题(实时更新)

    一.报错与警报 1.错误代码:No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=x86_64, VALID_ARCH ...

  9. 【汇总】iOS开发及Xcode使用中遇到的一些报错问题汇总

    这里整合下在开发过程中遇到过的一些报错问题和解决办法:(今天开始逐渐增加)   Xcode编译错误集锦:http://www.cnblogs.com/ios-wmm/p/3402261.html   ...

随机推荐

  1. SQL语句报错:Incorrect string value: '\xE9\x98\xBF\xE6\x96\xAF...'

    很明显是编码的问题.检查了一下$conn->query("set names utf8");已经加在代码里了.那莫非是数据库编码不是utf8? 看了一下 还真不是 于是右键要 ...

  2. STM32 系统滴答计时器

    ;//us与系统滴答的被乘数 ;//ms与系统滴答的被乘数 ;//系统运行秒数 /** * @description:系统滴答计时系统初始化 * @param 无 * @retval 无 */ voi ...

  3. 2019 鹏博士java面试笔试题 (含面试题解析)

      本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.鹏博士等公司offer,岗位是Java后端开发,因为发展原因最终选择去了鹏博士,入职一年时间了,之前面试了很多 ...

  4. 一个非常有趣的爬虫小练习带ocr识别的

    有个小的想法,想找一找 形近字 .百度一搜索,百度文库有一个,收费4元.而且我觉得字数不是太多.想自己弄一个,于是找到了 这个网站 http://www.fantiz5.com/xingjinzi/ ...

  5. nodejs中的_filename和_dirname

    _filename和_dirname都不是全局对象下的属性,它们都是模块下的 _filename:返回当前模块文件被解析过后的绝对路径,该属性并非全局,而是模块作用域下的 console.log(_f ...

  6. 手写MVC框架(二)-代码实现和使用示例

    --------上一篇:手写MVC框架(一)-再出发----- 背景 书接上文,之前整理了实现MVC框架需要写哪些东西.这周粗看了一下,感觉也没多少工作量,所以就计划一天时间来完成.周末的时间,哪会那 ...

  7. fileinput 配置项大全,从源码中翻出了很多属性,没那么多时间一一验证,特发出来给大家参考参考

    fileinput 配置项大全,从源码中翻出了很多属性,没那么多时间一一验证,特发出来给大家参考参考 fileinput 配置项大全 option 属性名 属性类型 描述说明 默认值 language ...

  8. UAVCAN DSDL介绍

    原文:http://uavcan.org/Specification/3._Data_structure_description_language/ DSDL:Data structure descr ...

  9. 使用SAP open connector调用第三方系统的API

    我们把hubspot这个SaaS CRM作为第三方系统,首先登录hubspot,创建一个新的API key: 把创建的key拷贝到剪切板里: 然后登录SAP Cloud for Customer上的o ...

  10. mysql DML select查询

    windows上的操作 1.从官网下载mysql 下载navicat,用来连接mysql的 2.打开运行启动mysql 3.在navicat上的连接打开新建连接 然后输入链接名,连接名就是用户名,自己 ...