【问题标题】:Redirect execution errors to file c++将执行错误重定向到文件 c++
【发布时间】:2014-12-17 19:52:02
【问题描述】:

如何在 bash 中重定向 c++ 可执行文件的执行错误?我发现 2> 在尝试识别编译错误时有帮助:

g++ example.cpp 2> compErr.txt

但使用该命令运行可执行文件仍会将错误发送到标准输出:

$ ./a.out 2> e.txt
Floating point exception (core dumped)

【问题讨论】:

  • 我能想到的唯一原因是这个特定的错误消息被写入标准输出。试试./a.out > e.txt
  • 这主要取决于example.cpp 在捕获异常时实现了什么。你能展示一下这些东西是如何打印出来的吗?
  • 它实际上是一个非常简单的示例代码,我用它来试验如何将其执行错误发送到文件:#include using namespace std; int main(){ int a, b; a=3; b=0; cout
  • 对不起,我是这方面的新手。我不知道如何格式化评论中的代码。但这是一个简单的除以零。错误不完全是重点,而是将其发送到文件的方式。
  • @nimrodm 我尝试了你的建议,但错误仍然出现在标准输出中,并且 e.txt 仍然为空

标签: c++ linux bash stdout stderr


【解决方案1】:

实际上,错误“浮点异常(核心转储)”确实不是来自可执行文件而是来自shell!来自bash 的消息不会被输出重定向抑制,但有一个标志可以启用/禁用这些消息。

您可以为一些会导致程序退出的错误安装信号处理程序,并将某些内容写入那里的合适目的地。有些信号无法截获,有些则难以处理。这就是您可以从代码内部执行的方法。

如果你想更进一步,可以fork()你的程序第一件事,并在子进程中完成实际工作。父进程本质上只是waitpid() 用于子进程,并使用接收到的结果结构中的信息向文件报告错误。

【讨论】:

  • 你能解释一下为什么shell会输出这个消息吗? (除非可执行文件无效)
  • 当程序以退出代码退出时,表明它可能收到未处理的信号并导致程序退出,shell 会打印这些消息。这种情况下的错误消息只是说程序中的某些浮点操作出错(例如,它导致了 [signalling] NaN)并且浮点异常被设置为导致信号。
  • 有没有办法将它们重定向到文件?我理解这个问题,我实际上在.cpp中引发了错误。我想知道的是如何将该错误消息发送到文件中。
  • 非常感谢。由于在这种情况下我只是打算在不“知道”它的情况下编译和执行代码,我想知道是否有办法直接用 bash 处理执行错误。
  • 谢谢@DietmarKühl!我做了类似的事情,它奏效了。我深入解释了我的发现。
【解决方案2】:

我在我的终端中找到了一些有用的东西,在这里:http://bytes.com/topic/c/answers/822874-runtime-error-stderr-gcc-ubuntu-bash

总之,一位参与者解释说:

在这种特殊情况下,字符串“浮点异常”没有被重定向的原因是它不是由运行 ./{file} 的进程或它调用的任何东西产生的。相反,它是由命令解释器自己生成的。

你可以通过告诉命令解释器运行另一个命令解释器来看到这一点,重定向这个子解释器的错误输出。但是,需要一点技巧:

$ bash -c './{file}; true' >out 2>err    
$ cat out
$ cat err
bash: line 1: 28106 Floating point exception./test_fail

【讨论】:

    猜你喜欢
    • 2016-03-13
    • 2022-01-05
    • 2015-08-22
    • 2012-08-16
    • 1970-01-01
    • 1970-01-01
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多