2016-12-14 7 views
0

を返すとき、私は2016.3システムのランニングpetalinux習慣を持っているし、次のことを守ってください。 私はコンパイルして(システムを使用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つのエコーをすべて見ることができますが、私たちは決してここにはいません。 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; 
} 

、問題はメイクファイル(lEasyBmp)に含まれ、ライブラリから来るように見えました。

使用しないとこの正確なエラーが発生したのはなぜなのですか?すべてのライブラリファイルが構築され、システム内に存在しますが、同じ問題が発生した人がいれば、ライブラリを含むいくつかのライブラリファイルがそれを引き起こす可能性があります。

+3

;'ファイルスコープで、あなたは – StoryTeller

+1

大きな問題を抱えている[なぜ悪いと考え、「名前空間stdを使用して」されています。次のような子でそれらを置く は、問題を解決しました練習?](http://stackoverflow.com/q/1452721/995714) –

+0

チップをありがとう!私は間違いなく、コード内の名前空間stdを使用してすべてを取り除くでしょう。しかし、それは悪いカーネルアクセスの問題を解決しません – btbtbt

答えて

0

問題は、あなたが作業しているカーネルにあると思います。

私のubuntuで同じコードを実行しただけでうまくいきます。

生成されたコアファイルを分析します。カーネルoopsメッセージに必要な情報が含まれている可能性があります。また、使用しているカーネルのバージョンに既知の問題がないかどうかを確認してください。

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

oopsはカーネルプリントです。 あなたのカーネル内の何かがうまくいきません。 再コンパイルよりも更新を試みてください。また、アプリケーションをクロスコンパイルしている場合、あなたのツールチェインはあなたのシステムにうまく構成されていません。

MMUが正常に動作していないようです。カーネルがユーザー空間のメモリまたはunmapped/reserved領域にアクセスしようとしました。

0

実際にはsystem()関数が問題を起こしていて、非常に奇妙な未定義の動作を引き起こしていたようです。あなたの実際のコードは、名前空間stdを使用して `持っている場合は

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