0

我试图使用 SymEnumSourceFiles 来获取调试模块中的文件名。但是作为回调函数中的参数的文件名似乎不完整。例如,一个名为“c:\program files\test\test.cpp”的文件只在 PSOURCEFILE 类型参数的 FileName 部分显示“c:\program fi”,这是非常连贯的。这是我的代码:

struct foo
{                                   
    static BOOL CALLBACK run( PSOURCEFILE pSourceFile, PVOID UserContext)
    {
        static TCHAR szFileName[MAX_PATH] = _T("");
        if (_tcscmp(szFileName, pSourceFile->FileName))
        {
            _tcscpy(szFileName, pSourceFile->FileName);
        }
        return TRUE;
    }
};

    HANDLE hCurrentProcess = GetCurrentProcess();
    SymInitialize(hCurrentProcess, NULL, FALSE);    
    DWORD64 BaseOfDll = SymLoadModule64(hCurrentProcess,
                                        NULL,
                                       (LPCSTR)_bstr_t(lpszFile),
                                        NULL,0,0);
    if(!SymEnumSourceFiles(hCurrentProcess, BaseOfDll, NULL, foo::run, (PVOID)pCallBack))
    {       
        ATLTRACE(_T(__FUNCTION__) _T(" error:0x%x\n"), GetLastError());
    }
    SymUnloadModule64(hCurrentProcess, BaseOfDll);
    SymCleanup(hCurrentProcess);

谁能告诉我哪里出错了?PS。当我简单地将 SymEnumSourceFiles 替换为 SymEnumLines 并更改回调函数时,我得到的文件名是正确的。

4

2 回答 2

0

尝试 ANSI 版本的 SymEnumSourceFiles。SymEnumSourceFilesW 函数中似乎存在错误。

于 2013-08-29T20:54:55.993 回答
0

SymEnumSymbols 曾经有一个错误,其中符号名称不是以零结尾的,也许这个是相关的。复制文件名后尝试将其清零(pSourceFile->FileName[0] = 0;)。

于 2013-07-23T10:22:24.613 回答