2016-12-14 47 views
0

我有一个自定义的PetaLinux 2016.3系统运行和遵守下列规定: 当我编译和运行使用系统(CPP)调用类似的例子在我得到:Linux下C++系统()调用崩溃时,函数返回

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模块/设置丢失,可能会导致系统以这种方式运行?

我有几千行代码运行其他库函数,它只是系统()似乎失败。

#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; 
} 

一些更多的调试后,这个问题似乎来自包含在生成文件(lEasyBmp)库。

为什么它在未使用时触发了这种确切的故障我还没有发现。所有库文件都是在系统中构建和找到的,但是如果任何人有相同的问题,包括一些库可能触发它。

+3

如果您的实际代码'使用命名空间std;'在文件范围内,你有更大的问题 – StoryTeller

+1

[为什么“使用命名空间std”认为是坏练习?](http://stackoverflow.com/q/1452721/995714) –

+0

谢谢你的提示!我肯定会摆脱所有在代码中使用namespace std。但是它不能解决不良的内核访问问题 – btbtbt

回答

0

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

我刚刚在我的ubuntu中运行相同的代码,它工作正常。

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

[email protected]:~/C$ ./a.out 
hello 
hello2 
hello3 
We never get here 
0

Oops是内核打印。 内核中的东西运行不正常。 尝试更新它,而不是重新编译,或者如果您正在交叉编译应用程序,那么您的工具链对于您的系统配置不佳。

似乎你的MMU工作不正常。内核尝试访问用户空间内存或un unmapped/reserved区域。

0

看来问题实际上是system()函数导致了一些非常奇怪的未定义行为。 将它们放在一个孩子,就像下面已经解决了这个问题:

void forksystem(char* command){ 
    pid_t pid; 
    int status = 0; 
    pid = fork(); 
    if(pid == 0){ 
     system(command); 
     exit(1); 
    } 
    wait(&status); 
}