1

我需要从 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,以便有人可以指出我设法忽略的任何内容。

只要你提供有用的信息,甚至可以取笑我的无知......

4

0 回答 0