【问题标题】:CaptureStackBackTrace and SymGetLineFromAddr64 can't get line info returns error code 487CaptureStackBackTrace 和 SymGetLineFromAddr64 无法获取线路信息返回错误代码 487
【发布时间】:2021-12-04 12:21:36
【问题描述】:
void printStack(void) {
     HANDLE process = GetCurrentProcess();
     SymInitialize( process, NULL, TRUE );

     SymSetOptions(SYMOPT_LOAD_LINES);


     void *stack[64];
     unsigned short frames = CaptureStackBackTrace( 0, 64, stack, NULL );

     SYMBOL_INFO *symbol = (SYMBOL_INFO*) calloc(sizeof(SYMBOL_INFO) + 256 * sizeof(char), 1);
     symbol->MaxNameLen = 255;
     symbol->SizeOfStruct = sizeof(SYMBOL_INFO);

     IMAGEHLP_LINE64 *line = NULL;
     DWORD lastError = 0;
     DWORD displacement;

  
     printf("Backtrace\n");
     for(int i = 0; i < frames; i++) {
         SymFromAddr(process, (DWORD64)(stack[i]), 0, symbol);
         printf("\t %i: %s\n", frames - i - 1, symbol->Name);
         line = (IMAGEHLP_LINE64 *)malloc(sizeof(IMAGEHLP_LINE64));
         line->SizeOfStruct = sizeof(IMAGEHLP_LINE64);
         if (SymGetLineFromAddr64(process, (DWORD64)(stack[i]), &displacement, line)) {
                printf("%s %i\n", line->FileName, line->LineNumber);
         } else {
                printf("failed\n");
         }
        lastError = GetLastError();
        printf("errcode: %i\n", lastError);
        
        free(line);
        line = NULL;
     }

     free(symbol);
}


Backtrace
         5: _printStack
failed
errcode: 487
         4: _main
failed
errcode: 487
         3: __scrt_common_main_seh
failed
errcode: -1073741819
         2: BaseThreadInitThunk
failed
errcode: 487
         1: RtlGetAppContainerNamedObjectPath
failed
errcode: 487
         0: RtlGetAppContainerNamedObjectPath
failed
errcode: 487

我正在尝试从 SymGetLineFromAddr64 中提取行号和文件名,但我输入的地址无效。我使用 (DWORD64)(stack[i]) 作为地址。 使用什么地址可以提取线路信息?

【问题讨论】:

  • 除非 API 函数失败,否则您不能依赖 GetLastError() 结果。
  • SymGetLineFromAddr64 失败
  • 我的错,你在“failed\n”行(在设置之前)上对lastError 的引用误导了我,但你实际上并没有打印出那里的值。跨度>
  • 在调用SymInitialize() 之后添加对SymSetOptions(SYMOPT_LOAD_LINES); 的调用有帮助吗?

标签: c windows


【解决方案1】:

我在我的 Makefile 中使用了 cl.exe,但没有 /Zi 编译选项。当我添加 /Zi 时,出现了行号和文件名。

【讨论】:

    猜你喜欢
    • 2014-10-15
    • 2015-10-16
    • 1970-01-01
    • 2011-10-18
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多