我有一个自定义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)中包含的库。
为什么它在未使用时触发了这个确切的失败我还没有发现。所有库文件都是在系统中构建和找到的,但如果有人遇到同样的问题,包括某些库可能会触发它。
答案 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效果不佳。内核尝试访问用户空间内存或未映射/保留的区域。