查找C+的符号+;源文件 我有一个项目是C++ Win32项目。我发现了一个问题 windbg可以识别某些符号,但有些不能识别。我不 我知道为什么。 其特点是:

查找C+的符号+;源文件 我有一个项目是C++ Win32项目。我发现了一个问题 windbg可以识别某些符号,但有些不能识别。我不 我知道为什么。 其特点是:,c++,winapi,windbg,pdb-files,C++,Winapi,Windbg,Pdb Files,2) 两个函数都在一个.cpp文件中 3) 这两个函数在源文件中非常接近,两者都不是 它们被一个#ifdef所包围 4) 我已使用dbh.exe检查符号,该符号在 windbg也不在pdb文件中 我猜符号丢失是否是由于 上课? 请推荐,谢谢! Bin是否调用过该函数 它可能有助于提供更多的细节,说明为什么您认为这是“由于类的继承”函数曾经被调用过吗 这可能有助于提供更多细节,说明为什么您认为这是“由于类的继承”听起来源代码可能与PDB文件不兼容 该函数可能是在生成PDB文件后添加的 您可以通过以

2) 两个函数都在一个.cpp文件中

3) 这两个函数在源文件中非常接近,两者都不是 它们被一个#ifdef所包围

4) 我已使用dbh.exe检查符号,该符号在 windbg也不在pdb文件中

我猜符号丢失是否是由于 上课? 请推荐,谢谢!
Bin

是否调用过该函数


它可能有助于提供更多的细节,说明为什么您认为这是“由于类的继承”

函数曾经被调用过吗


这可能有助于提供更多细节,说明为什么您认为这是“由于类的继承”

听起来源代码可能与PDB文件不兼容

该函数可能是在生成PDB文件后添加的

您可以通过以下方式对此进行验证:

  • 在您知道将要执行的代码行中添加断点
  • 逐步检查代码并确保调试器不会在任何空白代码行上停止(这意味着代码和PDB文件之间不匹配)
  • 我建议的第一件事是重建源代码,看看这是否解决了问题


    如果这不起作用,请提供更多信息,以便我们帮助您进一步诊断。

    听起来源代码可能与PDB文件不兼容

    该函数可能是在生成PDB文件后添加的

    您可以通过以下方式对此进行验证:

  • 在您知道将要执行的代码行中添加断点
  • 逐步检查代码并确保调试器不会在任何空白代码行上停止(这意味着代码和PDB文件之间不匹配)
  • 我建议的第一件事是重建源代码,看看这是否解决了问题


    如果这不起作用,请提供更多信息,以便我们帮助您进一步诊断。

    如果您不使用某个函数,只要它不是虚拟函数,链接器可能会将其删除。未使用的全局数据对象也可能会死机剥离。

    如果不使用函数,只要它不是虚拟函数,链接器可能会死机剥离它。未使用的全局数据对象也可能会死机。

    哦,是的,这正是原因所在。我向该函数添加了一个显式调用,然后它出现在pdb文件中。谢谢需要明确的是,函数最初是由函数指针通过CreateThread()引用的。我认为这个隐式调用使编译器认为代码没有使用它,所以它去掉了符号。是否有任何方法强制要求编译器将间接引用的函数添加到符号文件中?谢谢。如果您获取函数的地址,链接器不应该删除函数(它不能真的删除),它应该在调试信息中留下函数的符号信息。可以添加一些代码(函数签名和CreateThread调用)吗?实际上,函数是通过作为地址传递给CreateThread()的函数调用的:CreateThread(…func_a);func_a(){func_b();}func_a列在pdb文件中,但func_b不是。实际上,即使未使用的函数是虚拟函数,链接器也可以将其删除。目前的链接器还没有做到这一点,因为要证明虚拟函数未使用要稍微困难一些。然而,基于签名的机会检查可以找到一些未使用的虚拟函数,因此这是一个现实的链接器改进。@MSalters:我知道没有编译器可以删除虚拟函数。此外,在Windows中,可以在Exe和DLL之间共享C++对象,因此虚拟函数的死因会导致该平台上的许多程序崩溃。这是可能的,对于Linux C++动态库也同样如此。您只能安全地删除纯“静态”程序的虚拟函数,这些程序可以保证外部系统或动态链接代码与用户代码之间没有虚拟函数交互-因为这种保证几乎是不可执行的,所以vf剥离是不切实际的。哦,是的,这正是原因所在。我向该函数添加了一个显式调用,然后它出现在pdb文件中。谢谢需要明确的是,函数最初是由函数指针通过CreateThread()引用的。我认为这个隐式调用使编译器认为代码没有使用它,所以它去掉了符号。是否有任何方法强制要求编译器将间接引用的函数添加到符号文件中?谢谢。如果您获取函数的地址,链接器不应该删除函数(它不能真的删除),它应该在调试信息中留下函数的符号信息。可以添加一些代码(函数签名和CreateThread调用)吗?实际上,函数是通过作为地址传递给CreateThread()的函数调用的:CreateThread(…func_a);func_a(){func_b();}func_a列在pdb文件中,但func_b不是。实际上,即使未使用的函数是虚拟函数,链接器也可以将其删除。目前的链接器还没有做到这一点,因为要证明虚拟函数未使用要稍微困难一些。然而,基于签名的机会检查可以找到一些未使用的虚拟函数,因此这是一个现实的链接器改进。@MSalters:我知道没有编译器可以删除虚拟函数。此外,在Windows中,可以在Exe和DLL之间共享C++对象,因此虚拟函数的死因会导致该平台上的许多程序崩溃。这是可能的,对于Linux C++动态库也同样如此。您只能安全地删除纯“静态”程序的虚拟函数,这些程序可以保证外部系统或lin之间没有虚拟函数交互