我需要从 PDB 文件中获取与未命名命名空间中的变量相对应的文件名。我正在使用 VS2012 和 C++。我整理了一小部分琐碎的代码来说明问题:
// file: unnamed_namespace1.cpp Minimal test for anonymous namespace symbols
namespace {
float x;
static float xx;
}
int unnamed_namespace1(int data) {
x = 1.0f;
if (data == 0) {
// Computation
xx = x;
} else {
xx = 0.0;
}
return 1;
}
// file unnamed_namespace2.cpp Minimal test for anonymous namespace symbols
namespace {
float x;
float y;
float z;
static float xx;
static float yy;
static float zz;
}
int unnamed_namespace2(int data) {
x = 1.0f;
if (data == 0) {
// Computation
xx = x;
} else {
xx = 0.0;
}
return 2;
}
// file main.cpp
#include <iostream>
using std::cout;
using std::endl;
int unnamed_namespace1(int data);
int unnamed_namespace2(int data);
int main(int /* argc */, char** /* argv */) {
int r1 = unnamed_namespace1(0);
cout << "r1=" << r1 << endl;
int r2 = unnamed_namespace2(1);
cout << "r2=" << r2 << endl;
}
我需要一些方法来查看 PDB 文件并获得足够的信息来区分单独的 compilands 中的 x 和 xx 的两个实例。
我下载并玩了一个名为 dia2dump 的项目(来自https://msdn.microsoft.com/en-us/library/b5ke49f5.aspx),这确实有助于了解 DIA 系统的工作原理,相比之下IDiaSymbol 上的 MSDN“文档”大多缺乏任何上下文,并且几乎没有有意义的代码示例。
似乎没有将符号 x 和 xx 与源文件名联系起来的好方法。
我可以得到一个 IDiaSymbol* pSymbol,但是看起来它们可能实际上提供了我需要的各种函数都返回 S_FALSE:“S_FALSE 的返回值意味着该属性不适用于该符号。”
这是我在 dia2dump 中插入的一些代码片段:
BSTR bstrFname;
if (pSymbol->get_sourceFileName(&bstrFname) == S_OK) {
wprintf(L"fn:%s ", bstrFname); // <== never gets here
SysFreeString(bstrFname);
}else{
wprintf(L"no fn "); // <== this is always printed
}
我无法找到任何线索说明为什么 get_sourceFileName() 没有返回任何有用的信息。
我猜我要么 1) 找错了地方,要么 2) 编写调试接口访问 DLL 的程序员认为在匿名命名空间中为符号实现该功能不够重要。我希望它是#1,以便有人可以指出我设法忽略的任何内容。
只要你提供有用的信息,甚至可以取笑我的无知......