gpt4 book ai didi

windows - C++/CX 捕获异常 - 如何打印完整堆栈?

转载 作者:可可西里 更新时间:2023-11-01 11:34:15 31 4
gpt4 key购买 nike

我有一个用 C++/CX 编写的 Windows 应用商店应用程序(适用于 Windows 8),我已将一大块代码包装在 try/catch block 中。

catch block 正在工作并捕获异常,但到目前为止我似乎只能打印出异常的“消息”部分而不是完整的异常堆栈:

try
{
...
}
catch(Exception^ e)
{
LogMessage("Exception caught: " + e->ToString());
}

当捕获到异常时,LogMessage 仅输出以下文本:

"Exception caught: The object already exists"

我试过 e->ToString() 和 e->Message,但两者的输出相同,而且不包括完整的异常堆栈。

在 C# 中似乎很容易输出完整的异常堆栈,所以我不确定为什么在 C++/CX 中似乎很难?

最佳答案

这在 C++/CX 中很困难,因为确定堆栈中的函数需要代码来解析调试符号。在 C# 中,CLR 在运行时确实会记住哪些方法在堆栈中,但在 C++/CX 中,函数名称不会记录在生成的二进制文件中。换句话说,您在 C# 中获得的堆栈跟踪取决于 C# 功能:反射。

此外,调用纯 COM API 而不是 C++/CX API 的代码可能会导致异常。在这种情况下,异常是由下面的错误 HRESULT 返回代码生成的,而不是在抛出异常时生成的。 (实际上,每当跨越组件边界时都会发生这种情况;即使操作的双方都是 C++/CX,这也是使用普通 COM 处理的)因此,跟踪所需的堆栈不再可用。

C++ 异常不记录堆栈跟踪。从好的方面来说,当发生未处理的异常时,您可以从 native 程序收集小型转储,这样您就可以在需要时使用调试器查看堆栈。

关于windows - C++/CX 捕获异常 - 如何打印完整堆栈?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15561538/

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