当函数返回

时间:2016-12-14 14:17:11

标签: c++ linux

我有一个自定义petalinux 2016.3系统运行并观察以下内容: 当我编译并运行一个使用system()调用的cpp时,例如i get:

下的示例
Oops: kernel access of bad area, sig: 11
CPU: 0 PID: 381 Comm: Application Not tainted 4.6.0 #63
task: ce486500 ti: ce4cc000 task.ti: ce4cc000

我可以看到终端中的所有3个回声,但是Oops出现在“我们永远不会到达”printf之前。当function()返回时,似乎会出现坏区域的内核访问。

是否缺少一些可能使系统以这种方式运行的特定内核或rootfs模块/设置?

我有几千行代码运行其他库函数,只有system()似乎失败了。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

using namespace std;

void function(){
  system("echo hello");
  system("echo hello2");
  system("echo hello3");
}

int main(int argc, char **argv){
  function();
  printf("We never get here\n");
  return 1;
}

经过一些调试后,问题似乎来自makefile(lEasyBmp)中包含的库。

为什么它在未使用时触发了这个确切的失败我还没有发现。所有库文件都是在系统中构建和找到的,但如果有人遇到同样的问题,包括某些库可能会触发它。

3 个答案:

答案 0 :(得分:1)

似乎问题实际上是system()函数导致一些非常奇怪的未定义行为。 把它们放在像下面这样的孩子中解决了这个问题:

sage: eval('0b'+b)
15

答案 1 :(得分:0)

我认为问题在于您正在使用的内核。

我只是在我的ubuntu中运行相同的代码,它运行正常。

分析生成的核心文件。 kernel oops消息可能包含必要的信息。还要检查您使用的内核版本是否存在任何已知问题。

snagendr@SUPERMAN:~/C$ ./a.out 
hello
hello2
hello3
We never get here

答案 2 :(得分:0)

糟糕是内核打印。 内核中的某些东西效果不好。 尝试更新它,而不是重新编译,或者,如果您正在交叉编译应用程序,则您的工具链没有为您的系统配置好。

似乎您的MMU效果不佳。内核尝试访问用户空间内存或未映射/保留的区域。