小さなcプログラムをhpuxからlinuxに移行しようとしています。プロジェクトはうまくコンパイルされますが、実行時にクラッシュするとセグメント化エラーが表示されます。私はすでにstraceとgdbを使ってミラーの背後を見ようとしましたが、まだ理解していません。関連する(切り捨て)部品:という呼び出しセグメンテーションフォルト:HP-UXからLinuxへのCプログラムの移行
. . .
. . .
switch(sequenznummernabgleich(sockfd,c_snd_id,c_rec_id,c_timeout_quit)) {
/* kritischer Fehler */
case -1:
. . .
. . .
:
tts_send_2.c
は次のようにそのファイル内から呼び出されるメソッド
int sequenznummernabgleich(int sockfd, char *snd_id, char *rec_id, int timeout_quit) {
TS_TEL_TAB tel_tab_S01;
int n;
# truncated
}
が含まれています方法私はセグメンテーションフォールト(gdb出力)を提示しました:
Program received signal SIGSEGV, Segmentation fault.
0x0000000000403226 in sequenznummernabgleich (sockfd=<error reading variable: Cannot access memory at address 0x7fffff62f94c>,
snd_id=<error reading variable: Cannot access memory at address 0x7fffff62f940>, rec_id=<error reading variable: Cannot access memory at address 0x7fffff62f938>,
timeout_quit=<error reading variable: Cannot access memory at address 0x7fffff62f934>) at tts_snd_2.c:498
498 int sequenznummernabgleich(int sockfd, char *snd_id, char *rec_id, int timeout_quit) {
私は分かりません。私はこの方法は、GDBを使用して呼び出された行にステッピングてるときは、すべての変数は罰金探しています:
1008 switch(sequenznummernabgleich(sockfd,c_snd_id,c_rec_id,c_timeout_quit)) {
(gdb) p sockfd
$9 = 8
(gdb) p &sockfd
$10 = (int *) 0x611024 <sockfd>
(gdb) p c_snd_id
$11 = "KR", '\000' <repeats 253 times>
(gdb) p &c_snd_id
$12 = (char (*)[256]) 0xfde220 <c_snd_id>
(gdb) p c_rec_id
$13 = "CO", '\000' <repeats 253 times>
(gdb) p &c_rec_id
$14 = (char (*)[256]) 0xfde560 <c_rec_id>
(gdb) p c_timeout_quit
$15 = 20
(gdb) p &c_timeout_quit
$16 = (int *) 0xfde660 <c_timeout_quit>
私はまた、straceの出力を作成しました。ここでは上記のコードに関する最後の部分です:
任意のアイデア?私は本当に似たようなケースを見つけることなく、何時間もWebともちろんstackoverflowを検索しました。
おかげ
クリツ
どのラインがクラッシュしていますか?関数の呼び出しの前にコードを投稿できますか(つまり、変数の宣言と呼び出し時に値を設定するコード)? –
私はあなたが関数にステップインして、変数がどのようなものか見てみる必要があると思います。 – user3386109
Cは_methods_をサポートしていません。機能のみ。 – Olaf