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 退出,未执行任何代码的主要内容,如果未能解决你的问题,请参考以下文章
程序只需要 1 个字母输入并退出,而剩余的代码未执行,为啥?
尽管正确打印出所有输出,但程序未在 Java 中以退出代码 0 结束