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)