memcpy löst Segmentation Fault aus
-
Ich bin an ein Projekt rangesetzt worden bei dem ich einen Simulator schreiben soll der so tut als wäre er ein Protokoll-Gateway das Signalisierungsnachrichten aus'm Telefonie-Festnetz annimmt und beantwortet.
Für die Interprozeß-Kommunikation wurde eine Klasse geschaffen die ein 512 Byte unsigned char Array enthält. Sämtliche Nachrichten (ziemlich umfangreich struct und union Konstruktionen) die anfallen sollen da reinkopiert werden:memcpy(test->request->m_RequestData.m_InfoData.data,&test->inUceData,sizeof(ITU_TCAP::sInSvcUceData));
Das Objekt Test enthält sowohl ein Objekt der Klasse zur Kommunikation (request) als auch die Nachrichtenstruktur(inUceData).
Wenn ich mit dem GDB debugge läuft alles wunderbar. Das Programm kopiert alles rüber und auch wieder zurück in eine Zielstruktur und der GDB kann mir auch in der Nachricht enthaltene Variablen ausspucken.Sobald ich jedoch versuche den Kram auszugeben...
cout << test->inUceData2.m_Hdr.m_infoRequestorID << endl;
...beendet das Programm mit nem Segmentation Fault und der Backtrace vom GDB gibt als Ausgangspunkt des Fehlers eben diese Ausgabe an und führt es bis zu chunk_free() zurück:
#0 0x40a72832 in chunk_free () from /lib/libc.so.6
#1 0x40a7238a in chunk_alloc () from /lib/libc.so.6
#2 0x40a71fde in malloc () from /lib/libc.so.6
#3 0x40a778d0 in strdup () from /lib/libc.so.6
#4 0x40989e63 in int std::__convert_from_v<unsigned long>(char*, int, char const*, unsigned long, __locale_struct* cons
#5 0x4097ba30 in std::ostreambuf_iterator<char, std::char_traits<char> > std::num_put<char, std::ostreambuf_iterator<ch
#6 0x4097b580 in std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::do_put(std::ostreambuf_i
#7 0x409a4f13 in std::ostream::operator<<(unsigned long) () from /usr/lib/libstdc++.so.5
#8 0x409a5266 in std::ostream::operator<<(unsigned) () from /usr/lib/libstdc++.so.5
#9 0x0804a0ca in main () at Test.cpp:55
#10 0x40a1c522 in __libc_start_main () from /lib/libc.so.6Hat wer ne Ahnung was ich falsch mache? Ich hab den Fehler durch Rumprobieren mit dem GDB bereits auf die memcpy Sache eingegrenzt. Vielleicht mach ich was mit den Referenzierungen falsch. Ich kannte mich bisher nur in Java OOP aus und hab irgendwann mal Ansi-C gelernt.
Jeder Hinweis ist willkommen. Danke!
-
Teste mal dein Programm mit Valgrind.
-
Danke für den Tipp. Da muß ich mir erstmal die Erlaubnis einholen um das Tool zu installieren. Ich hab hier ein eigenes Subnetz zum Testen von dem Kram abgeschottet bekommen. Da kann ich leider nicht einfach schalten und walten wie ich will. Mal sehen...