C++ 程序以代码 01 退出,未执行任何代码

Posted

技术标签:

【中文标题】C++ 程序以代码 01 退出,未执行任何代码【英文标题】:C++ Program exited with code 01 no code was executed 【发布时间】:2014-03-19 13:12:17 【问题描述】:

当我在我的计算机上运行我的程序时,一切都按预期工作。但最近我已将该应用程序移至运行 Ubuntu 12.04(与我的计算机相同)的魔杖板。该程序的结构类似于:

...
headers
...

bool continueStuff = true;

log4cplus::Logger makeLogger(std::string str)

    ...
    Init custom loggers
    make loggers
    set properties
    return logger


log4cplus::Logger logger = makeLogger("MainLogger");
void signalHandler(int signum)

    switch(signum)
       
        // Fatal signals
        case 1:
        case 2:
        case 3:
        case 4:
        case 6:
        case 8:
        case 9:
        case 10: 
        case 11: 
        case 12: 
        case 13: 
        case 14: 
        case 15: 
            printf("Fatal signal(%d) received. Shutting down\n", signum);
            LOG4CPLUS_FATAL(logger, "Fatal signal(" << signum << ") received. Shutting down.");

            exit(signum);
            break;

        // Non-fatal signals
        default:
            LOG4CPLUS_INFO(logger, "Non-fatal signal(" << signum << ") received.");
       


...
functions
...

int main()

    printf("Starting\n");
    signal(SIGINT, signalHandler);
    ...

该程序在魔杖板上编译得非常好,但是当我运行它时它立即退出。我尝试通过 gdb 在 main 方法、全局变量声明和在 main 之前调用的任何构造函数设置断点来运行它。我在 main 之前执行的所有代码中也都有打印语句,但没有打印任何内容。

我的机器和魔杖板上的 g++ 版本相同。 库都是相同的版本(除了一个),但我认为这不是问题,因为我没有看到任何编译器错误。

我也从不返回积极的退出状态,我的应用要么返回 0 表示成功,要么返回 -1 表示失败。正如您在上面的代码中看到的,我还处理程序接收到的所有信号,并在退出之前打印和错误消息。

更新:

valgrind 输出:

==18828== Command: ./app
==18828== Parent PID: 18092
==18828==
==18828== Jump to the invalid address stated on the next line
==18828==    at 0x388: ???
==18828==  Address 0x388 is not stack'd, malloc'd or (recently) free'd
==18828==
==18828==
==18828== Process terminating with default action of signal 11 (SIGSEGV)
==18828==  Bad permissions for mapped region at address 0x388
==18828==    at 0x388: ???
==18828==

更新 2:

在读取以下输出后,我使用的是预编译库: readelf -AW libPrecompileLib.so 我发现它是为 cortex-a9 处理器编译的,而所有系统库都是为 7-A 处理器编译的。由于库无法与系统对话,因此它无法运行。

我是否可以为 cortex-a9 处理器编译我的应用程序?

我试过了:

g++ -mcpu=cortex-a9 -c src.cpp -o app

但由于没有链接(根据 -c),它是不可执行的。但是,一旦我删除了 -c,readelf 输出就会显示它是 7-A。

【问题讨论】:

除非我弄错了,否则你调用的是exit(signum),它将强制终止程序,而不是执行后面的代码。 @Cyber​​ 这是他的信号处理程序,除非发出信号,否则不会执行。 @Rick 但您确实在出现信号时使用正退出代码退出。 我只exit(signum) 当它是一个致命信号时,所以无论如何都不会执行任何代码。而且这段代码甚至不太可能正在运行,因为打印语句没有显示在控制台上。 @PeterSchneider 你是对的,当我说我不知道​​时,我错过了发言。但无论哪种方式,我都非常怀疑这是由于没有打印“收到的致命信号(%d)......”的问题。还有一个事实是,signalHandler 的赋值是在 main 中的第一个 print 语句之后设置的。 【参考方案1】:

http://linux.die.net/man/2/signal 请注意敦促您使用sigaction 的部分,因为signal 不是很便携。

【讨论】:

虽然这是事实,并且可能会在以后引起问题,但我在我的机器和魔杖板上都运行 Ubuntu 12.04,并使用相同版本的 g++ 来编译应用程序。因此,它们之间不应该存在可移植性问题。

以上是关于C++ 程序以代码 01 退出,未执行任何代码的主要内容,如果未能解决你的问题,请参考以下文章

VS2013,C++:未知的“线程 X 以代码 0 退出”

程序只需要 1 个字母输入并退出,而剩余的代码未执行,为啥?

尽管正确打印出所有输出,但程序未在 Java 中以退出代码 0 结束

Symfony 简单 PHPUnit 退出代码 1,未显示错误

线程以代码 0 (0x0) 退出,没有未处理的异常

多处理程序(生产者-消费者)退出而不打印任何东西 Python 3