私はsegfaultとTracebackがどのように機能するかを完全に理解していませんが、リストの一番上にある関数が "glib"または "gobject"を参照している場合は通常エラー(TM)があってはならないという印象を受けています。
まあ、それは私が完全に異なる2つのプログラムから得たものです。
最初のものはgithub.comで直接コンパイルされた最新バージョンのirssiです(欠陥やエラーなしでクリーン)。
Program received signal SIGSEGV, Segmentation fault.
0xb7cf77ea in g_ascii_strcasecmp () from /usr/lib/libglib-2.0.so.0
(gdb) bt
#0 0xb7cf77ea in g_ascii_strcasecmp () from /usr/lib/libglib-2.0.so.0
#1 0x08103455 in config_node_section_index ()
#2 0x081036b0 in config_node_traverse ()
#3 0x080fb674 in settings_get_bool ()
#4 0x08090bce in command_history_init ()
#5 0x08093d81 in fe_common_core_init ()
#6 0x0805a60d in main ()
私が問題を抱えている2番目のプログラムは、GTK用に構築されたNetSurf Webブラウザです(やはり100%きれいにコンパイルされています)(GTK用に作成されていない場合は正常に実行されます)。
Program received signal SIGSEGV, Segmentation fault.
0xb7c1bace in g_type_check_instance_cast () from /usr/lib/libgobject-2.0.so.0
(gdb) bt
#0 0xb7c1bace in g_type_check_instance_cast () from /usr/lib/libgobject-2.0.so.0
#1 0x080cd31c in nsgtk_scaffolding_set_websearch ()
#2 0x080d05da in nsgtk_new_scaffolding ()
#3 0x080dafd8 in gui_create_browser_window ()
#4 0x0809e806 in browser_window_create ()
#5 0x080c2fa9 in ?? ()
#6 0x0807c09d in main ()
私は私が見ている問題がglib2の一種の欠陥だと99.99%確信しています。私のシステムの残りの部分は100%うまく動作します。ただこの二つのプログラムが変なことをしているだけです。
私はこのライブラリを使用する別のプログラムを作成しようとすると、やはり失敗する可能性が高いと思います。
明らかに、小さな間違いでさえグリブと友達を突くことは、システムのほとんどすべてのプログラムを致命的に衝突させる即時の方法です(長い間、他のシステムでの経験に基づいて申し上げます:P)。
私はこのようなことで私が何をしているのか分からないということを考えると、そこに行くのが嫌いです。現在のシステム構成を維持したいと思います。 :)
コンパイルするつもりだと思います。新しいglib2(およびco.)バージョンをインストールしてから、これらのプログラムをここに静的にリンクします。何をすべきかわかりません。どのような措置を講じるべきですか?
私の他のアイデアは、./configure --prefix=/usr; make; make install
現在私のシステムにあるglibの正確なバージョンを「復元」して再インストールすることです。関連コアライブラリがすべて」0.3200.4":
-rwxr-xr-x 1 root root 1.4M Aug 9 2012 /usr/lib/libgio-2.0.so.0.3200.4
-rwxr-xr-x 1 root root 1.2M Aug 9 2012 /usr/lib/libglib-2.0.so.0.3200.4
-rwxr-xr-x 1 root root 11K Aug 9 2012 /usr/lib/libgmodule-2.0.so.0.3200.4
-rwxr-xr-x 1 root root 308K Aug 9 2012 /usr/lib/libgobject-2.0.so.0.3200.4
-rwxr-xr-x 1 root root 3.7K Aug 9 2012 /usr/lib/libgthread-2.0.so.0.3200.4
これがうまくいく可能性がありますか、それとも深刻に問題を引き起こす可能性がありますか? :S
うまくいけば、"0.3200.4"はどのバージョンに翻訳されますか?
また、どんなアイデアを試してみることができますか?
根本的なエラーが何であれ、修正するためにglib自体に対する修正を必ず探しているわけではありません。これは私には影響しません。それ非常に悪い。 irssiとNetSurfを正しく実行したいです。
ベストアンサー1
私の考えでは、リストの一番上にある関数が "glib"または "gobject"を参照している場合、通常はエラーが発生しないライブラリにBad Issues(TM)が発生することです。
これがライブラリに欠陥がある可能性があることを意味する場合は、間違った印象を受けます。これが意味するものではありません。以前のバグが発生した場所がここにある可能性が高いです。デフォルトでは、Cには多くのランタイム保護機能がないため、コンパイルされているが追加の検証されていない引数を簡単に渡すことができます(直接実行しない限り)。簡単な例:
int main (void) {
char whoops[3] = { 'a', 'b', 'c' };
if (strcmp(whoops, "abcdef")) puts(whoops);
終了していない文字列を複数の異なる文字列関数に渡します。これは問題なくコンパイルされ、ほとんどがうまく動作します。メモリ違反とても微妙ですが、できるstrcmp()
またはputs()
。これはstrcmp()
実装に問題があるという意味ではありません。エラーは明らかですmain()
。
このような関数は、渡された引数が適切に終了したかどうかを論理的に検証できません。これはWRTランタイムチェックを意味しますが、Cには「本質的に」チェックがありません。ほとんどの場合、データはそれほどハードコーディングされていないため、コンパイラが何を調べるべきかを指定することはあまり意味がありません。
途中の項目を逆追跡することも可能ですが、必ずしも機能するわけではありません。一般的に言えば、見始めるところは次のとおりです。最後入り口が問題です。逆追跡到着
しかし、エラーはいつでもどこにでも存在できます。多くの場合、メモリチェッカーが報告したエラーとバックトレースを比較すると、valgrind
範囲を絞り込むのに役立ちます。 WRT あなたの例は、おそらく見ることが多いでしょう。最後に、valgrindとgtkは幸せな遊びの友人ではありません。
私はglib2(および共同)の新しいバージョンをコンパイルし、これらのプログラムをここに静的にリンクするつもりです。
できますが、それがどんなものでも良くなると信じる理由はありません。ストローを握っているのです。実際に問題を直接デバッグできないことは理解できるので、何を試すことができるのか必死に疑問に思います。
おそらくあなたは多くの時間を無駄にし、欲求不満を感じるでしょう。
私は私が見ている問題がglib2の一種の欠陥だと99.99%確信しています。
私はあなたがこの分野について過信していると99%確信しています。
別のバグできる経験的に、最も広くテストされた部品は、最も可能性の低い犯人と見なされるべきです。この場合、glibはかなり一般的ですが、irssiとNetSurfは比較的あいまいです。
最善の方法はバグレポートを送信することです。そこではバックトラッキングがしばしば人気があります。 irssiとNetSurfで始めると、glibを直接話すと、彼らは証明できない限り(これらのどれも証明できない限り)、それが彼らの問題であると信じる理由がないと合法的に言うでしょう。一方、irsiの人が決めるとはい愉快な場合には、自分でこれを追求しようとする誘惑を受けることもできます。