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:
Irgendwelche Ideen? Ich habe stundenlang im Internet gesucht und natürlich stackoverflow, ohne einen wirklich ähnlichen Fall zu finden.
Dank
Kriz
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)? –
Ich denke, Sie müssen in die Funktion treten und sehen, wie die Variablen dann aussehen. – user3386109
C unterstützt _methods_ nicht. Nur funktioniert. – Olaf