【发布时间】: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);的调用有帮助吗?