相关疑难解决方法(0)

Win32 - 从C代码回溯

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

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

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

在此输入图像描述

在Linux或Mac OS X上,我可以查找execinfo.h以便使用该backtrace功能,因此我可以显示有关内存故障的其他信息.

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

我已经看过如何在C中获取堆栈跟踪?在Stack Overflow上.我不想使用第三方库,所以CaptureStackBackTrace或者StackWalk函数看起来不错.

唯一的问题是我只是不知道如何使用它们,即使使用Microsoft文档.

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

对这些功能有什么解释,也许是一些例子?

编辑

我现在正在考虑使用这个CaptureStackBackTrace函数DbgHelp.lib,因为似乎开销有点少......

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

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 )( …
Run Code Online (Sandbox Code Playgroud)

c windows backtrace

43
推荐指数
1
解决办法
3万
查看次数

来自正在运行的应用程序的Windows C++堆栈跟踪

所有,

我看到一个应用程序,一个SVN Visual Studio插件,当它崩溃时显示了一个漂亮的可读堆栈跟踪.

我很乐意将其添加到我的应用程序中.我该如何提供?没有电子邮件的信息,只需一个视觉显示就足够了.

visual-c++

16
推荐指数
2
解决办法
2万
查看次数

对当前堆栈进行校验和

我想在main中对当前堆栈进行校验和,以检查它是否在两点之间被改变.

例如:

int main(void) {
    ...
    stack_checksum();

    ... process ...

    if(stack_checksum() != ...)
        altered.
}
Run Code Online (Sandbox Code Playgroud)

如何获取基本堆栈地址和堆栈顶部的当前地址?

编辑: 随着@MiroslavBajtoš帮助,步骤方法:

  • 将局部变量放在结构中
  • 检查回溯返回数组

c stack checksum

7
推荐指数
1
解决办法
246
查看次数

标签 统计

c ×2

backtrace ×1

checksum ×1

stack ×1

visual-c++ ×1

windows ×1