2013-10-01 14 views
7

これらの2つのセグメンテーションフォルトはアンドロイドにあります。SEGV_MAPERRが1つ、SEGV_ACCERRが1つあります。セグメンテーションフォールトの「コード」の意味は何ですか

これらの2の違いは何ですか?

signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 41963214 

signal 11 (SIGSEGV), code 2 (SEGV_ACCERR), fault addr 4006e000 

ありがとうございます。 siginfo.hパー

+0

'SEGV_MAPERR'はメモリ割り当てエラー(ダングリングポインタ、メモリオーバーフローなど)で、' SEGV_ACCERR'はメモリアクセスエラーです。通常はアクセス許可です。それとももっと何かを探していますか? – Simon

+0

SEGV_ACCERRがスタック破損によって引き起こされたと言うのは公正でしょうか? – michael

+0

まあ、スタックポインタを使ってアクセス権のないメモリにアクセスしても、それは起こりそうにないかもしれませんね。何してるの? – Simon

答えて

12

SEGV_MAPERRは、あなたが何にマップされないアドレスにアクセスしようとしたことを意味します。

SEGV_ACCERRは、アクセス権のないアドレスにアクセスしようとしたことを意味します。

どちらの場合も、あなたが持ってはならないアドレスにアクセスしました。おそらくあなたの実際のコードは有罪です。前者の場合は、とにかくそのアドレス範囲にメモリがありません。後者の場合、そのアドレス範囲にメモリがありますが、あなたはそれを所有していません。

ランダムアドレスにアクセスする場合は、その時点でOSがどのようにプロセスをセットアップしているかによって異なります。

0

*((int*)0)=1のようなメモリにアクセスすると、SEGV_MAPERRが得られます。

あなたはmprotect(2)とメモリを保護した場合、例えば、mprotect(buffer, pagesize, PROT_READ)は、その後、あなたがSEGV_ACCERRを取得します、*(buffer)=1のようなメモリを変更しました。

詳細はman mprotectをご覧ください。

関連する問題