首页 > 解决方案 > 在有和没有 TUI 的情况下,从析构函数中抛出的行为会有所不同

问题描述

我已经修改了以下有效 C++ 项目 8:防止异常离开析构函数,以便没有两个异常传播,因此这里不会出现崩溃/UD:

#include <iostream>

class Bad
{
    public:
        ~Bad()
        {
            std::cout << "Throw in ~Bad()." << std::endl;
            throw 1;
        }
};
int main()
{
    try
    {
        Bad   bad;
    }
    catch(...)
    {
        std::cout << "Print This" << std::endl;
    }
}

预期和实际输出:

Throw in ~Bad().
Print This

运行 gdb 也会给出相同的行为。但是通过 gdb TUI 运行会使程序在throw 1

这是可重现的:

g++ --version
g++ (GCC) 4.8.3 20140911 (Red Hat 4.8.3-9)
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

问题:无论我是通过 gdb 还是通过 gdb TUI 运行,打包到二进制文件中的机器指令都是相同的,这是否意味着 TUI 解释指令的方式与 gdb 解释的方式不同?

同样,在过去,当可执行文件通过 gdb 运行并直接以 ./a.out 运行时,我发现了不同的行为,我无法理解同一个可执行文件如何仅通过我们运行它的方式给出不同的结果

注意:在 g++ 4.8.5 上运行时同样不可重现。

标签: c++gdbtui

解决方案


推荐阅读