1

所以,这就是我遇到的问题。

void * something = ???;
void (*fun)(void*) = ???;

try
{
    fun(something);
}
catch (...)
{
    assert(false);
}

我的任务是确定断言被解雇的原因。不幸的是,我无法更改上面的代码。此外,这是在多线程环境中,并且在程序关闭期间。执行 try/catch 的部分在现实世界的代码中非常有目的地解锁。当我尝试单步执行程序时,它突然消失在我身上……我什至无法进行正确的 fun() 调用,更不用说进入它了。

我唯一的办法似乎是在 catch(...) 中放置一个断点并检查那里的任何内容。不幸的是,这并没有告诉我什么,因为我不知道真正的乐趣是什么,也不知道什么是什么。

在这一点上,我唯一的希望是我能以某种方式让 Visual Studio 调试器告诉我是什么...,如果我能找出它被抛出的位置,我会非常高兴。它至少不在自动列表中……可能在其他地方吗?有什么办法可以让我在这里取得进步还是我搞砸了?我感觉被搞砸了...

====

更新:有一个外部程序在没有及时关闭时杀死了我的。这就是为什么踩踏使它消失的原因。与线程无关。

一旦我意识到我能够按照建议打开异常。不幸的是,没有地方可以抛出一个......这是访问冲突。被存储的函数会以某种方式受到冲击。

4

2 回答 2

3

尝试使用在引发异常时中断执行的 Visual Studio 功能。转到 Visual Studio 主菜单 Debug -> Exceptions 并勾选所有异常。

这样,当你的异常被抛出时,Visual Studio 就会停止,你就会知道它是什么。

于 2013-01-16T00:17:31.853 回答
1

您可以直接进入菜单:Debug|Exceptions并标记您怀疑抛出的异常吗?如果您可以步进/附加到应该可能的正在运行的程序。这将导致调试器在抛出特定异常时中断。

我通常在 Debug|Exceptions 对话框中标记整个子树“ Win32 Exceptions ”。我假设您的程序不会抛出并默默地忽略其他(Win32)异常(在这种情况下,您会有很多“错误”警报)。

我希望这会有所帮助。

于 2013-01-16T00:17:18.267 回答