2016-12-30 6 views
1

で書かれたLinuxのデーモンプロセスのデバッグ:私はCで書いたデーモンは、これらのエラーメッセージを取得する際にC

[Fri Dec 30 07:58:54 2016] listend[13944]: segfault at 0 ip b7601e22 sp bf901d00 error 4 in libc-2.19.so[b7575000+1a7000] 

[Fri Dec 30 07:58:54 2016] listend[13948]: segfault at 0 ip b7601e22 sp bf901d00 error 4 in libc-2.19.so[b7575000+1a7000] 

[Fri Dec 30 07:58:54 2016] listend[13949]: segfault at 0 ip b7601e22 sp bf901d00 error 4 in libc-2.19.so[b7575000+1a7000] 

[Fri Dec 30 07:58:54 2016] listend[13950]: segfault at 0 ip b7601e22 sp bf901d00 error 4 in libc-2.19.so[b7575000+1a7000] 

[Fri Dec 30 07:58:54 2016] listend[13951]: segfault at 0 ip b7601e22 sp bf901d00 error 4 in libc-2.19.so[b7575000+1a7000] 

[Fri Dec 30 07:58:54 2016] listend[13952]: segfault at 0 ip b7601e22 sp bf901d00 error 4 in libc-2.19.so[b7575000+1a7000] 

[Fri Dec 30 07:58:54 2016] listend[13953]: segfault at 0 ip b7601e22 sp bf901d00 error 4 in libc-2.19.so[b7575000+1a7000] 

[Fri Dec 30 07:58:54 2016] listend[13954]: segfault at 0 ip b7601e22 sp bf901d00 error 4 in libc-2.19.so[b7575000+1a7000] 

[Fri Dec 30 07:58:54 2016] listend[13955]: segfault at 0 ip b7601e22 sp bf901d00 error 4 in libc-2.19.so[b7575000+1a7000] 

私の質問は、私はその機能を確認するためにlibc-2.19.soにそのアドレスを調べることができる方法でありますエラーが発生したときに呼び出されていますか?私は、GDB

を使用してみましたが、私は得る:

$ gdb code/listen/i686-Linux/listend 
. 
. 
(gdb) info addr 0xb7575000 
No symbol "0xb7575000" in current context. 
(gdb) info addr 0xb771c000 
No symbol "0xb771c000" in current context. 
+4

デーモンを['valgrind'](http://valgrind.org)で実行してください。バグはほとんど確かにlibcにはありません。 valgrindは_first_無効なメモリアクセスを引き起こした_あなたのコード_の中のポイントを明らかにするでしょう。これはバグの根本的な原因ではないかもしれませんが、現在のところ根本原因にはるかに近いものです。 – zwol

+0

私はlibcのどの機能が、私のコードに戻ってくるのかを指摘していることがわかりました。私は100%私のコードがlibcではなく、バグを持っていることを知っています;-) –

+3

また、最適化やデバッグシンボルを使わずにコードをコンパイルするのに役立ちます: 'gcc -O0 -g ...'。これにより、gdbとvalgrindの両方の出力が向上します。 –

答えて

1

あなたが問題に診断をするために、ここで行うことができるという非常に少ないがあります提供するデータで。私が推測できることは、0であるアドレスがNULLの逆参照を指していることです(文字列アドレスへのポインタとしてNULLを渡すか、それと同様に、printf()コールが失敗するなど) )アドレス0x1a7000は、libcで例外が発生しています。 libc.so.xx.xx.xxにnm(1)を実行することで、おそらく関数名を推測できます。コアをダンプする(デーモンを実行する前にulimit -c unlimitedを設定することにより)、死後デバッガを使用することができます。あるいは、おそらくデーモンのソースコードも役に立ちます。申し訳ありませんが、あなたの質問は完全には解決できません。詳細については、How to create a Minimal, Complete, and Verifiable exampleを参照してください。

+0

これは私が探していた答えでした:あなたはおそらくlibc.so.xx.xx.xxにnm(1)を実行することで関数名を推測できます。ありがとう! –

+0

これがあなたが探していた答えであれば、そのようにマークしてください! :))あなたは、死後のコアイメージとgdbデバッガで実際の答えを得るでしょう。 –

+0

このエラーは断続的に発生します。私は時々数週間それをキャッチしようとしています。 –

関連する問題