0

Solaris 10 を使用していますが、C プログラムがクラッシュし、コア ファイルが作成されます。デバッグすると、libc.so.1 にコアが作成されているようです。誰か手がかりがあれば教えてください。以下は、dbx レポートです。

dbx prock.new core
For information about new features see `help changes'
To remove this message, put `dbxenv suppress_startup_message 7.6' in your .dbxrc
Reading prock.new
core file header read successfully
Reading ld.so.1
Reading libsocket.so.1
Reading libnsl.so.1
Reading libl.so.1
Reading libpthread.so.1
Reading librt.so.1
Reading libthread.so.1
Reading libc.so.1
Reading libaio.so.1
Reading libmd.so.1
Reading libc_psr.so.1
WARNING!!
A loadobject was found with an unexpected checksum value.
See `help core mismatch' for details, and run `proc -map'
to see what checksum values were expected and found.
dbx: warning: Some symbolic information might be incorrect.
t@null (l@1) terminated by signal SEGV (no mapping at the fault address)
0xffffffff7ea3bc14: strcasecmp+0x0134:  orn      %i0, %i3, %i0
(dbx) where
=>[1] strcasecmp(0x10014b68e, 0x57, 0x7ffffc00, 0x1001332d7, 0x27, 0x24), at 0xffffffff7ea3bc14
  [2] 0x10000af48(0x27, 0x10014b68e, 0x57, 0x10014b68e, 0x57, 0x0), at 0x10000af48
  [3] 0x100009c08(0x27, 0x5e, 0x0, 0x9, 0x1001332c3, 0x2b), at 0x100009c08

(dbx) whereis strcasecmp
function:       `libc.so.1`strcasecmp
(dbx)

私のsolarisバージョンは

               Solaris 10 8/07 s10s_u4wos_12b SPARC
   Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
                Use is subject to license terms.
                    Assembled 16 August 2007
4

3 に答える 3

2

いいえ、問題はC標準ライブラリではありません。に無効なパラメータ(NULL文字列ポインタなど)を渡していますstrcasecmp()。実際のコード(まだ投稿していない)がないと、エラーが正確に何であるかを推測することはできません。

(また、デバッグシンボルを使用してプログラムをコンパイルすることをお勧めします-最適化をオフにします!Solarisを使用している場合は、おそらくGCCを使用します。

gcc -O0 -g etc...

)。

于 2012-08-01T13:52:58.237 に答える
1

1) デバッグ情報を含めるようにプログラムをコンパイルします (コンパイラのオプションのリストに "-g" を追加します)。これにより、次の代わりに実際に情報を取得できます。

 [2] 0x10000af48(0x27, 0x10014b68e, 0x57, 0x10014b68e, 0x57, 0x0), at 0x10000af48
 [3] 0x100009c08(0x27, 0x5e, 0x0, 0x9, 0x1001332c3, 0x2b), at 0x100009c08

2) DBX は、どの関数が呼び出し strcasecmpているかを通知します。ソースをステップ実行し (またはログ出力を生成し)、致命的な関数呼び出しのパラメーターをチェックして、通常とは異なるもの (無効なポインターなど) がないかどうかを確認します。

libc 関数のバグを発見する可能性は、その関数への呼び出しにエラーがあった可能性に比べればごくわずかです。

于 2012-08-01T13:54:54.307 に答える
0

1) bt (バックトレース) を実行して、誰が strcasecmp を呼び出しているかを確認します [これにより、 #0、#1 などのフレームが一覧表示されます]

2)特定のフレームにジャンプして値を取得します[フレーム0]

3) 次に、strcasecmp に渡された引数の値を表示/出力します (print または display を使用)。

strcasecmp の呼び出しで引数が NULL だと感じているため、segfault が発生しています。

于 2012-08-01T19:16:25.423 に答える