gpt4 book ai didi

c - Win32 - 来自 C 代码的回溯

转载 作者:可可西里 更新时间:2023-11-01 11:58:48 29 4
gpt4 key购买 nike

我目前正在寻找一种在 Windows 下从 C 代码(非 C++)获取回溯信息的方法。

我正在构建一个具有引用计数内存管理功能的跨平台 C 库。它还具有一个集成内存调试器,可提供有关内存错误的信息 (XEOS C Foundation Library)。

当发生故障时,启动调试器,提供有关故障的信息,以及涉及的内存记录。

enter image description here

在 Linux 或 Mac OS X 上,我可以查找 execinfo.h 以使用 backtrace 函数,这样我就可以显示有关内存故障的附加信息。

我在 Windows 上寻找同样的东西。

我见过 How can one grab a stack trace in C? 在 Stack Overflow 上。我不想使用第三方库,所以 CaptureStackBackTraceStackWalk 函数看起来不错。

唯一的问题是我不知道如何使用它们,即使有 Microsoft 文档也是如此。

我不习惯 Windows 编程,因为我通常在 POSIX 兼容系统上工作。

这些函数有哪些解释,也许还有一些例子?

编辑

我现在正在考虑使用 DbgHelp.lib 中的 CaptureStackBackTrace 函数,因为开销似乎要少一些...

这是我到目前为止尝试过的:

unsigned int   i;
void * stack[ 100 ];
unsigned short frames;
SYMBOL_INFO symbol;
HANDLE process;

process = GetCurrentProcess();

SymInitialize( process, NULL, TRUE );

frames = CaptureStackBackTrace( 0, 100, stack, NULL );

for( i = 0; i < frames; i++ )
{
SymFromAddr( process, ( DWORD64 )( stack[ i ] ), 0, &symbol );

printf( "%s\n", symbol.Name );
}

我只是变得垃圾。我想我应该使用 SymFromAddr 以外的东西。

最佳答案

好的,我明白了。 :)

问题出在 SYMBOL_INFO 结构中。需要在堆上分配,为符号名预留空间,并正确初始化。

这是最终代码:

void printStack( void );
void printStack( void )
{
unsigned int i;
void * stack[ 100 ];
unsigned short frames;
SYMBOL_INFO * symbol;
HANDLE process;

process = GetCurrentProcess();

SymInitialize( process, NULL, TRUE );

frames = CaptureStackBackTrace( 0, 100, stack, NULL );
symbol = ( SYMBOL_INFO * )calloc( sizeof( SYMBOL_INFO ) + 256 * sizeof( char ), 1 );
symbol->MaxNameLen = 255;
symbol->SizeOfStruct = sizeof( SYMBOL_INFO );

for( i = 0; i < frames; i++ )
{
SymFromAddr( process, ( DWORD64 )( stack[ i ] ), 0, symbol );

printf( "%i: %s - 0x%0X\n", frames - i - 1, symbol->Name, symbol->Address );
}

free( symbol );
}

输出是:

6: printStack - 0xD2430
5: wmain - 0xD28F0
4: __tmainCRTStartup - 0xE5010
3: wmainCRTStartup - 0xE4FF0
2: BaseThreadInitThunk - 0x75BE3665
1: RtlInitializeExceptionChain - 0x770F9D0F
0: RtlInitializeExceptionChain - 0x770F9D0F

关于c - Win32 - 来自 C 代码的回溯,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5693192/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com