在linux(Ubuntu)终端中运行gcc adventure.c -o adventure
后跟adventure
将为我编译并执行它。在运行期间发生错误(例如分段故障)时,它将在终端输出中报告它。在Linux上显示命令行中的实际错误
在windows中,一个运行时错误只会弹出一个“adventure.c”已停止工作的对话框,并且没有任何内容写入到cmd.exe屏幕的输出中。
有什么办法可以在Windows出现时报告错误?
在linux(Ubuntu)终端中运行gcc adventure.c -o adventure
后跟adventure
将为我编译并执行它。在运行期间发生错误(例如分段故障)时,它将在终端输出中报告它。在Linux上显示命令行中的实际错误
在windows中,一个运行时错误只会弹出一个“adventure.c”已停止工作的对话框,并且没有任何内容写入到cmd.exe屏幕的输出中。
有什么办法可以在Windows出现时报告错误?
在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
,但我不喜欢接触到这样的事情......
这并没有真正的帮助。在Windows上,无论子系统如何,进程崩溃都会触发对话框。您可以使用环境变量禁止该对话框,但不能将其更改为打印到控制台。 – 2014-09-19 00:41:57
@AndrewMedico:你说得对,我用一个结构化的异常处理解决方案来编辑我的文章。 – 2014-09-19 09:31:20
您的异常处理解决方案似乎没问题,因为缺少更好的默认设置。对于实际的项目,我会使用调试器或正确的错误处理方式,但对于小型“试飞”类程序来说,这大多令人厌烦。我很好奇为什么这么少的人似乎被这种行为困扰? – user717572 2015-05-23 18:25:52
这是什么都与C++做? – crashmstr 2014-09-18 18:34:58
我认为c和C++在保持单个文件程序时几乎具有相同的编译/执行周期。我想我会删除C++标签 – user717572 2014-09-18 18:36:16
我不认为它是“直接”支持的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