2014-09-18 70 views
2

在linux(Ubuntu)终端中运行gcc adventure.c -o adventure后跟adventure将为我编译并执行它。在运行期间发生错误(例如分段故障)时,它将在终端输出中报告它。在Linux上显示命令行中的实际错误

在windows中,一个运行时错误只会弹出一个“adventure.c”已停止工作的对话框,并且没有任何内容写入到cmd.exe屏幕的输出中。

有什么办法可以在Windows出现时报告错误?

+0

这是什么都与C++做? – crashmstr 2014-09-18 18:34:58

+0

我认为c和C++在保持单个文件程序时几乎具有相同的编译/执行周期。我想我会删除C++标签 – user717572 2014-09-18 18:36:16

+0

我不认为它是“直接”支持的Windows ..但我想你可以尝试[GetLastError](http://msdn.microsoft.com/en-us/library/ windows/desktop/ms679360(v = vs.85).aspx)和[FormatMessage](http://msdn.microsoft.com/en-us/library/windows/desktop/ms679351(v = vs.85)。aspx) – 2014-09-18 18:42:01

回答

1

在Windows下,您可以定义你建立一个可执行文件(子系统REF:/SUBSYSTEM (Specify Subsystem)两个以上公共子系统CONSOLE命令行应用程序和WINDOWS对GUI的人

如引用页面解释的,。子系统通常通过标准C main功能自动设置为CONSOLE通常,与应用程序相关的错误显示在与应用程序相连的控制台中,并且与WINDOWS应用程序相关的错误打开消息框。

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

编辑:

安德鲁医学生意见好以后(感谢他),我做了测试和......他是正确的:-(......即使控制台编程'被打开的消息框中默认情况下,不写什么悲伤...

所以,你将不得不使用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; 
    } 
    

所有这些包装用结构化异常处理程序,即捕捉任何致命错误,只需将原始代码写入错误的代码和地址,其中该错误发生。由于错误已被捕获,Windows不再打开消息框(调试器除外)。通常情况下,使用FormatMessage会显示错误文本,但我无法尝试使用它。

一个清洁的方法是使用修改crt0,但我不喜欢接触到这样的事情......

+1

这并没有真正的帮助。在Windows上,无论子系统如何,进程崩溃都会触发对话框。您可以使用环境变量禁止该对话框,但不能将其更改为打印到控制台。 – 2014-09-19 00:41:57

+0

@AndrewMedico:你说得对,我用一个结构化的异常处理解决方案来编辑​​我的文章。 – 2014-09-19 09:31:20

+0

您的异常处理解决方案似乎没问题,因为缺少更好的默认设置。对于实际的项目,我会使用调试器或正确的错误处理方式,但对于小型“试飞”类程序来说,这大多令人厌烦。我很好奇为什么这么少的人似乎被这种行为困扰? – user717572 2015-05-23 18:25:52