2016-10-15 31 views
0

小さな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の出力を作成しました。ここでは上記のコードに関する最後の部分です:

strace output

任意のアイデア?私は本当に似たようなケースを見つけることなく、何時間もWebともちろんstackoverflowを検索しました。

おかげ

クリツ

+0

どのラインがクラッシュしていますか?関数の呼び出しの前にコードを投稿できますか(つまり、変数の宣言と呼び出し時に値を設定するコード)? –

+0

私はあなたが関数にステップインして、変数がどのようなものか見てみる必要があると思います。 – user3386109

+0

Cは_methods_をサポートしていません。機能のみ。 – Olaf

答えて

-2

更新15.10.16

はさらに時間のデバッグ後、私は本当の問題を発見しました。

typedef struct { 
    TS_BOF_REC bof; 
    TS_REM_REC rem; 
    TS_EOF_REC eof; 
    int   bof_len; 
    int   rem_len; 
    int   eof_len; 
    int   cnt;  
    char   teltyp[LEN_TELTYP+1]; 
    TS_TEL_ENTRY entries[MAX_TEL]; 
} TS_TEL_TAB; 

、それが構造体TS_TEL_ENTRY

typedef struct { 
    int len; 
    char tel[MAX_TEL_LEN]; 
} TS_TEL_ENTRY; 

問題埋め込まだ:メソッド「sequenznummernabgleich」の最初の行には、構造体

TS_TEL_TAB tel_tab_S01; 

の宣言は、これは、次のように定義されていますMAX_TEL_LENの値が512から1024に変更されているため、構造体がほぼ倍にサイズ変更されています。STACK S IZEはもう十分に大きくはなかった

解決策 スタックサイズを8Mbから64Mbに設定するだけです。これは、ulimitコマンド(linux以下)を使用して実現できます。

一覧現在のスタックサイズ:64Mバイトへulimit -s

設定スタックサイズ:ulimit -s 65535

:スタックサイズの値はキロバイトです。 ulimitコマンドの良い短い参照用

は、私が長い年月にHP/UXを使用していないが、hazily次の提案のための十分なを覚えていますかss64

+0

XY溶液。最初は問題を解決していますが、間違ったアプローチです。あなたはフラットタイヤを持っていて、タイヤを固定する代わりにスケートボードをその場所に置きます。 – Olaf

+0

@Olafメモリ要件が大きくなったので、私はもっとそれを与えました。その解決策に何が問題なのですか? –

+0

私は問題が何かをコメントしました。 Firefoxなどのツールが標準スタックで動作する場合、私はあなたのプログラムが例外であるとは思わない。いくつかの研究をして、点滅を取り除いてください。 – Olaf

0

@見て:

は「あなたのことを確認してください変数/ストラットを正しく初期化する。 mallocではなくcallocを使用します。

特定のビットパターンの順序を想定しないでください(例:下位バイト、上位バイト)。マシンのスカイエンディアン。コンパイラには通常、適切な順序を処理するマクロがあります。

関連する問題