c - 像在 Linux 上一样在命令行中显示实际错误

标签 c linux windows gcc

当在 linux (Ubuntu) 终端中运行 gcc adventure.c -o adventure 后跟 adventure 时,将为我编译并执行。当在运行时发生错误(例如段错误)时,它将在终端输出中报告。

然而,在 Windows 中,运行时错误只会弹出“adventure.c”已停止工作对话框,而不会向 cmd.exe 屏幕的输出写入任何内容。

有没有什么方法可以让我在 Windows 上收到错误报告?

最佳答案

在 Windows 下,您定义为其构建可执行文件的子系统(引用:/SUBSYSTEM (Specify Subsystem)。两个更常见的子系统是用于命令行应用程序的 CONSOLEWINDOWS对于 GUI 的。

如引用页中所述,子系统通常会自动设置为 CONSOLE,因为存在标准 C main 函数。 通常,与CONSOLE 应用程序相关的错误显示在附加到该应用程序的控制台中,与WINDOWS 应用程序相关的错误打开一个消息框。

但我不知道你的冒险版本中究竟存在什么(很多存在于...) - 嗅探,我玩冒险的时候还年轻:-)。您应该尝试生成一个最小的 SIGSGV 控制台程序(在 C 中很容易..)并验证错误显示的位置。

根据评论编辑:

在 Andrew Medico 发表评论(感谢他)之后,我做了测试......他是对的:-(......即使是控制台程序也默认打开消息框并且不写任何东西。悲伤.. .

所以你将不得不使用Microsoft structured exception handling实现你想要的,但你需要稍微修改源代码:

  • 原始来源:

    #include ...
    ...
    
    int main(...) {
       ...
    }
    
  • 修改源

    #include ...
    #include <excpt.h>
    #include <windows.h>
    ...
    
    int real_main(...) {
       ...
    }
    
    int filter(DWORD code, LPEXCEPTION_POINTERS info) {
        fprintf(stderr, "Fatal error %x at %x\n", code,
            info->ExceptionRecord->ExceptionAddress);
        return EXCEPTION_EXECUTE_HANDLER;
    }
    
    int main(int argc, char *argv[]){
        int cr;
        __try {
            cr = real_main(...);
        }
        __except(filter(exception_code(), exception_info())) {
            cr = 1;
        }
        return cr;
    }
    

所有这些都使用结构化异常处理程序包装原始代码,捕获任何 fatal error 并简单地写入错误代码和发生错误的地址。由于错误已被捕获,Windows 不再打开消息框(调试器除外)。通常最好使用 FormatMessage 来显示错误文本,但我无论如何都无法使用它。

更简洁的方法是使用修改后的 crt0,但我不喜欢碰这样的东西......

关于c - 像在 Linux 上一样在命令行中显示实际错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25919958/

相关文章:

java - 无法通过套接字连接到linux机器

linux - insmod : ERROR: could not insert module HelloWorld. ko: 不允许操作

windows - 如何使文件真正不可变(不可删除且只读)?

c - 括号 [] 运算符是否只能使用一次?

mysql - Azure 数据工厂 - 连接到本地 Mysql,Linux 上的 protected 服务

windows - 如何使用 VS 测试代理创建 windows docker 镜像?

windows - 为什么对 HKEY_CURRENT_USER 注册表配置单元的 32 位 View 的访问会回退到 64 位 View ?

c - FCC 100 和 111 点阵 C 代码

c - 寻求澄清/理解 gcc 的标签作为值(value)特征

c++ - 在 OpenCV 中将图像转换为彩色铅笔素描