C++ 是否有线程安全的方法来获取c/c+中当前线程的调用堆栈+;在窗户上?

C++ 是否有线程安全的方法来获取c/c+中当前线程的调用堆栈+;在窗户上?,c++,winapi,visual-c++,C++,Winapi,Visual C++,我一直在尝试获取当前线程的调用堆栈,以改进库代码中使用的现有跟踪库。我想要文件和行号,或者至少是函数/方法名,只是原始地址不行 我遇到的问题是,StackWalker和其他基于dbghelp.h函数的解决方案不是线程安全的,在使用StackWalker时,即使我在库中使用互斥锁,我也会随机崩溃。我还尝试使用boost::stacktrace,但它不起作用,而且boost在我的组织中非常不受欢迎 我的目标是首先让它在Windows上工作,然后我将在linux/posix实现上工作,这可能会容易得多

我一直在尝试获取当前线程的调用堆栈,以改进库代码中使用的现有跟踪库。我想要文件和行号,或者至少是函数/方法名,只是原始地址不行

我遇到的问题是,StackWalker和其他基于dbghelp.h函数的解决方案不是线程安全的,在使用StackWalker时,即使我在库中使用互斥锁,我也会随机崩溃。我还尝试使用boost::stacktrace,但它不起作用,而且boost在我的组织中非常不受欢迎

我的目标是首先让它在Windows上工作,然后我将在linux/posix实现上工作,这可能会容易得多。我对win32 api不是很了解,你们中有人知道实现这一点的api吗?最后,我希望一切都是开源的。我还想使这个库非常简单和小,这样任何人都可以使用它


谢谢

在Windows上生成堆栈跟踪几乎没有什么用处,因为在Windows中,您有更强大的工具,例如。事实上,这是您获取符号信息的唯一希望,而不是实际随应用程序一起发送符号。当前线程的get调用堆栈始终是线程安全的,因为访问的数据只属于当前线程
StackWalk[64]
专为调试器设计-为另一个进程、线程执行此操作。对于为自线程执行此操作-使用我希望有文件和行号-为此,您需要pdb。作为变体,您可以保存
CV\u info\u PDB
(使用
IMAGE\u DEBUG\u TYPE\u CODEVIEW
查找
IMAGE\u DEBUG\u目录
)中的信息,前提是您的二进制文件具有调试信息,然后将其转换为文件和行号,在这些文件和行号中,您已将pdbI更详细地查看到boost中。它可以处理多个线程,并且不需要使用dbghelp.h函数。它们使用Dbgeng.h中的函数,而这些函数没有说明它们不是线程安全的。另外,进入booststacktrace代码,我没有看到任何锁定。我想我会研究boost实现,并尝试提出类似的东西。@nicolasb565-Dbgeng.h如果您为另一个进程(不是self)实现调试器和/或执行此操作,则需要使用它。如果您想为自线程执行此操作,最简单有效的方法是使用RtlCaptureStackBackTrace。要从地址获取文件/行号,您需要有pdb文件,在Windows上生成堆栈跟踪几乎没有什么用处,在Windows上,您有更强大的工具,如。事实上,这是您获取符号信息的唯一希望,而不是实际随应用程序一起发送符号。当前线程的get调用堆栈始终是线程安全的,因为访问的数据只属于当前线程
StackWalk[64]
专为调试器设计-为另一个进程、线程执行此操作。对于为自线程执行此操作-使用我希望有文件和行号-为此,您需要pdb。作为变体,您可以保存
CV\u info\u PDB
(使用
IMAGE\u DEBUG\u TYPE\u CODEVIEW
查找
IMAGE\u DEBUG\u目录
)中的信息,前提是您的二进制文件具有调试信息,然后将其转换为文件和行号,在这些文件和行号中,您已将pdbI更详细地查看到boost中。它可以处理多个线程,并且不需要使用dbghelp.h函数。它们使用Dbgeng.h中的函数,而这些函数没有说明它们不是线程安全的。另外,进入booststacktrace代码,我没有看到任何锁定。我想我会研究boost实现,并尝试提出类似的东西。@nicolasb565-Dbgeng.h如果您为另一个进程(不是self)实现调试器和/或执行此操作,则需要使用它。如果您想为自线程执行此操作,最简单有效的方法是使用RtlCaptureStackBackTrace。要从地址获取文件/行号,您需要有pdb文件