当在 linux (Ubuntu) 终端中运行 gcc adventure.c -o adventure
后跟 adventure
时,将为我编译并执行。当在运行时发生错误(例如段错误)时,它将在终端输出中报告。
然而,在 Windows 中,运行时错误只会弹出“adventure.c”已停止工作对话框,而不会向 cmd.exe 屏幕的输出写入任何内容。
有没有什么方法可以让我在 Windows 上收到错误报告?
最佳答案
在 Windows 下,您定义为其构建可执行文件的子系统(引用:/SUBSYSTEM (Specify Subsystem)。两个更常见的子系统是用于命令行应用程序的 CONSOLE
和 WINDOWS
对于 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/