2016-10-15 2 views
0

Ich versuche, ein kleines c-Programm von hpux zu Linux zu migrieren. Das Projekt kompiliert fein, stürzt aber zur Laufzeit ab und zeigt mir einen Segmentierungsfehler. Ich habe bereits versucht, mit strace und gdb hinter den Spiegel zu sehen, verstehe aber immer noch nicht. Die entsprechenden (abgeschnitten) Teile:Segmentation Fault: C-Programm Migration von HPUX zu Linux

tts_send_2.c

enthält eine Methode

int sequenznummernabgleich(int sockfd, char *snd_id, char *rec_id, int timeout_quit) { 
    TS_TEL_TAB tel_tab_S01; 
    int n; 

    # truncated 
} 

, die aus dieser Datei wie folgt aufgerufen:

. . . 
. . . 
switch(sequenznummernabgleich(sockfd,c_snd_id,c_rec_id,c_timeout_quit)) { 

     /* kritischer Fehler */ 
     case -1: 
. . . 
. . . 

wenn Sie anrufen, dass Methode Ich habe einen Segmentierungsfehler (gdb output):

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) { 

was ich einfach nicht verstehe. Als ich in die Linie bin Schritt, wo die Methode gdb aufgerufen wird, werden alle Variablen suchen fein:

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> 

Ich habe auch eine strace Ausgabe erstellt. Hier ist der letzte Teil des Codes in Bezug auf oben gezeigt:

strace output

Irgendwelche Ideen? Ich habe stundenlang im Internet gesucht und natürlich stackoverflow, ohne einen wirklich ähnlichen Fall zu finden.

Dank

Kriz

+0

In welcher Zeile stürzt es ab? Können Sie den Code vor dem Aufruf Ihrer Funktion veröffentlichen (d. H. Die Variablendeklarationen und der Code, der sie zum Zeitpunkt des Aufrufs auf ihre Werte setzt)? –

+0

Ich denke, Sie müssen in die Funktion treten und sehen, wie die Variablen dann aussehen. – user3386109

+0

C unterstützt _methods_ nicht. Nur funktioniert. – Olaf

Antwort

-2

-Update 15.10.16

Nach Debuggen für mehr Stunden selbst fand ich das eigentliche Problem. In der ersten Zeile der Methode "sequenznummernabgleich" ist eine Erklärung einer Struktur

TS_TEL_TAB tel_tab_S01; 

Dieses wie folgt definiert ist:

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; 

und es struct TS_TEL_ENTRY

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

Das Problem eingebettet ist, dass der Wert für MAX_TEL_LEN von 512 auf 1024 geändert wurde und somit die Struktur fast doppelt so groß wurde, was dazu führte, dass die STACK S IZE war nicht mehr groß genug.

LÖSUNG Legen Sie einfach die Stapelgröße von 8 MB bis 64 MB fest. Dies kann mit dem Befehl ulimit (unter Linux) erreicht werden.

Liste aktuelle Stack-Größe: ulimit -s

Set Stapelgröße auf 64 MB: ulimit -s 65535

Hinweis: Die Werte für die Stack-Größe sind in kB.

Für eine gute kurze ref auf ulimit Befehl haben Sie einen Blick @ss64

+0

XY-Lösung. Während es das Problem an erster Stelle löst, ist es der falsche Ansatz. So wie du einen platten Reifen hast und ein Skateboard an seinen Platz stellst, anstatt den Reifen zu reparieren. – Olaf

+0

@Olaf der Speicherbedarf wurde größer, also gab ich es mehr. Was ist los mit dieser Lösung? –

+0

Ich habe kommentiert, was das Problem ist. Wenn Tools wie Firefox usw. mit dem Standard-Stack arbeiten, bezweifle ich, dass Ihr Programm eine Ausnahme darstellt. Machen Sie etwas Forschung, entfernen Sie Blinker, – Olaf

0

ich keine HP/UX in Äonen verwendet haben aber für die folgenden Vorschläge hazily genug erinnern:

Stellen Sie sicher, dass‘ Variablen/Struts richtig initialisieren. Verwenden Sie Calloc statt Malloc.

Gehen Sie auch nicht von einer bestimmten Reihenfolge der Bitmuster aus: zB Low-Byte, dann High-Byte. Ska Endian-Ness der Maschine. Es gibt normalerweise Makros im Compiler, die die richtige Reihenfolge für Sie behandeln.