2012-02-22 8 views
2

最初に、私が間違った場所にこれを書いている場合は、お詫び申し上げます。 私はvalgrindユーザーフォーラムを見つけることができないようです。このようなものを投稿することはできません。そして、この場所はかなり包括的であるように見えるので、私はそれを試してみました。正統性のないLinuxカーネルとvalgrind

自分のコードを実行するときには、やや正統性のないLinuxカーネルが必要です。 私はそれを書いていないので、カーネルについて詳しくは分かりません。 私のカーネルは何らかの理由で、デフォルトのLinuxカーネルのsyscallテーブルを拡張しているようです。 .koファイルのinsmodで、現在の標準のsyscallテーブルが拡張され、333のように表示され、341に進み、元のsyscallテーブルが保存され、。 koはrmmodedされています。 これらの余分なシステムコールは、私が実行しているプロプライエタリソフトウェアである と一意のIPC通信を実行しているようです。

もちろん、これはvalgrindで地獄になるようです。

もちろん私のプログラムをmemcheckするのにvalgrindを使用したいが、valgrindは常にクラッシュする 私のアプリケーションがシステムコールを実行する瞬間。 は、ここで私はvalgrindのから得る出力され、マイナスいくつかの事私はむしろ

==26045== Thread 2: 
==26045== Syscall param preadv(vector) points to unaddressable byte(s) 
==26045== at 0x4000982: ??? (in /lib/ld-2.9.so) 
==26045== by 0x426C756: syscall (in /lib/libc-2.9.so) 
==26045== by 0x4037430: com_lock (coms.c:114) 


--23932-- VALGRIND INTERNAL ERROR: Valgrind received a signal 11 (SIGSEGV) - exiting 
--23932-- si_code=1; Faulting address: 0x165; sp: 0x63a6dde4 

valgrind: the 'impossible' happened: 
    Killed by fatal signal 
==23932== at 0x3809D5E0: vgSysWrap_linux_sys_preadv_before (syswrap-linux.c:3413) 
==23932== by 0x380785CB: vgPlain_client_syscall (syswrap-main.c:1382) 
==23932== by 0x38076330: vgPlain_scheduler (scheduler.c:929) 
==23932== by 0x380A13E8: run_a_thread_NORETURN (syswrap-linux.c:98) 
==23932== by 0x380A1732: vgModuleLocal_start_thread_NORETURN (syswrap-linux.c:268) 
==23932== by 0x380A8AC8: ??? (in /usr/local/lib/valgrind/memcheck-x86-linux) 

私はこれらの余分なシステムコールを使用しないようにするために残念ながらそれは不可能です。 私が直面している課題は、それらをどう対処するかです。

私が今までに学んだことは、valgrindで新しい、またはカスタマイズされたsyscallラッパーを指定できることです。残念ながら、私は、システムコールのアドレスがすべてランタイム中に切り替えられているときに、それを取り除く方法をあまり知らない。

誰もが、標準ではない(そして、valgrindにラッパーを切り替えるように指示する方法を知っている)カーネルに追加したsyscall用のvalgrind syscallラッパーを作成した経験があれば、いくつかの詳細、参考資料などを返信してください。私は本当にそれを感謝します。

私はG ++ 4.1.1と2.6.29はgentoo (私の独自のカーネルモジュールがロードされるまで、すべての意図や目的のために、それは2.6.29 Gentooの)

をオフに構築されたカスタムカーネルで、valgrindの3.7を使用しています

編集:

私は最初に投稿して以来、これに関するいくつかの事柄を発見しました。 valgrindにはinclude/vki/vki-scnums-x86-linux.hというファイルがあります。 その中のコメント(valgrind 3.7.0はここで覚えています)によれば、2.6.9カーネルのasm-i386/unistd.hのカット&ペーストです。 命令列挙333において、__NR_preadvが定義される。 私にとっては、valgrindはmy_ipcというシステムコールを実行するときに死にます。my_ipcはカーネル固有のシステムコールで、333以外に列挙されています。 valgrindのコンパイル時にsyscallマッピングエラーが発生しているようです。実際にカーネルで何が起きているのかそのため、syscallラッパーvalgrindは、syscallを見ると呼び出しを試みます。333は、関数呼び出しシグネチャがおそらく一致しないため、実際にsyscall 333を処理できません。

私はpreadvのように思えます...

preadv(int fd, const struct iovec *iov, int iovcnt, off_t offset); 

と私が言うことができるものから、私のIPC呼び出しは

asmlinkage long my_ipc (uint, long, long, long, long, long); 
+0

テーブルを拡張するだけですか?それはエントリを無効にしている可能性があり、valgrindがシステムコールを作成するときに、それが必要なものではない(アクセスが悪いと思われる) –

+0

さらにレビューした後、エントリを無効にします。 – sbrett

+0

それは私が思ったことです:) –

答えて

3

のように見える基本的に、あなたがこの問題を解決しようとしている唯一の方法はと衝突し、システムコールのサポートを削除するにはvalgrindのを修正することですカスタムシステムコールのための最小限のサポートを追加してください。 valgrindは、同じスロットを使用する標準のシステムコールであるかのように、カスタムシステムコールの引数を解釈しようとしています。

valgrindソースツリーのルートにあるREADME_MISSING_SYSCALL_OR_IOCTLファイルは、valgrindにシステムコールラッパーを追加する方法のガイダンスとして最適な場所です。

valgrindディスカッションフォーラムに関するご質問には、mailing lists、または#valgrind IRCチャンネルがあります。

+0

だから、私は平らなので、特定のシステムコールのためのvalgrindと挿入のサポートをビルドする必要がありますか?簡単な方法はないと思います。システムコールの両方のセットを単一のvalgrindビルドに共存させる方法があるかどうかは不明でしたが、おそらくそれは難しいでしょう。私は2つの別々のvalgrind実行ファイルを保持できると思います。 – sbrett

+0

システムコールは純粋に番号で識別され、カーネルは最新のアップストリームカーネルによって追加された新しいコールと衝突する番号を使用するカスタムコールを追加したため、これらは共存できません。だからvalgrindはあなたのマシンのシステムコール333が普通のものとは違うことを知る方法がありません。 – TomH

関連する問題