Symbol

Symbol能够包含以下的一些信息:

  • 全局变量
  • 局部变量
  • 函数名称, 参数
  • 结构体
  • 源代码行号

有三种类型的Symbol

  • export symbols
    是dll本身的一部分. 比如ntdll.dll和kernel32.dll暴露出很大一部分他们的函数, 以便于他们能够像API一样地调用, 但是大多数的dll会有很少的exported symbols. 大致上, export symbol不包含函数的参数信息, 并且因为暴露的函数实在太少, 所以当你只有export symbol的时候不能确定栈信息的正确性.
  • pdb symbols (public symbols)
    包含一些基本的符号信息, 比如说函数名和全局变量, 但是, 并不是所有的函数名都会在public symbol中暴露出来. dll的开发者可以选择暴露什么到public symbol中, 他可以隐藏任何它觉得会暴露过多的实现信息的信息.
  • private pdb symbols (private symbols)
    包含上面列出的所有信息.

在debugging的时候, symbols会跟各自的dll或者exe匹配起来, 匹配的桥梁是一个GUID. 这意味着, 哪怕在你的符号搜索路径下有多个版本的ntdll.pdb, debugger也会知道用哪一个与你当前版本的ntdll.dll进行匹配.

 

symbol的路径包括以下几个地点:

  • .sympath
  • dll被加载的目录
  • 环境变量_NT_SYMBOL_PATH指定的目录

摘译自:

Why do I get weird function names on my stack? (a discussion on symbols)

http://blogs.msdn.com/tess/archive/2005/12/05/why-do-i-get-weird-function-names-on-my-stack-a-discussion-on-symbols.aspx

posted on 2010-03-07 14:11  中道学友  阅读(571)  评论(0编辑  收藏  举报

导航

技术追求准确,态度积极向上