gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 10:36:03 25 4
gpt4 key购买 nike

当在 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/

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