最初に、私が間違った場所にこれを書いている場合は、お詫び申し上げます。 私は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);
テーブルを拡張するだけですか?それはエントリを無効にしている可能性があり、valgrindがシステムコールを作成するときに、それが必要なものではない(アクセスが悪いと思われる) –
さらにレビューした後、エントリを無効にします。 – sbrett
それは私が思ったことです:) –