Segmentation Fault auf std::string
Bin ich eine Anwendung ausführen, die Haltestellen an einem Punkt wegen "segmentation fault".
Ich werde versuchen, zu gewinnen der Umgebung:
- Die Anwendung hat eine Klasse (Generator), die enthält ein std::string member (- Daten ) und dieses Mitglied ist ordnungsgemäß intialized "HelloWorld".
- Ein Zeiger, der das Objekt übergeben wird, um eine member-Funktion(send1) von einer anderen Klasse (Produkt). Sobald ich versuche, drucken Sie den Wert von Daten innerhalb der Funktion gibt es einen segmentation fault. Wenn ich versuche, drucken Sie den Wert der Daten, bevor Sie die send1 Funktion, wird es korrekt gedruckt.
Hier ist die gdb-Ausgabe :
(gdb) br Generator::test
Breakpoint 1 at 0x80499ef: file ../app/generator/src/generator.cpp, line 58.
(gdb) br Product::send1
Breakpoint 2 at 0x804a17e: file ../app/configurator/src/product.cpp, line 43.
(gdb) run
[Thread debugging using libthread_db enabled]
[New Thread -1208071520 (LWP 18389)]
[Switching to Thread -1208071520 (LWP 18389)]
Breakpoint 1, Generator::test (this=0x9917020) at ../app/generator/src/generator.cpp:58
58 cout << "data = " << this->data << endl;
(gdb) n
data = HelloWorld
59 Product* ptr = new Product;
(gdb) n
60 bool status = ptr->send1( this );
(gdb) s
Breakpoint 2, Product::send1 (this=0x99170c8, genptr=0x9917020) at ../app/configurator/src/product.cpp:43
43 cout << genptr->data << endl;
(gdb) p genptr->data
$1 = {static npos = 4294967295,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
_M_p = 0x99170b4 "HelloWorld"}}
(gdb) n
Program received signal SIGSEGV, Segmentation fault.
0x076751e6 in std::operator<< <char, std::char_traits<char>, std::allocator<char> > () from /usr/lib/libstdc++.so.6
(gdb) bt
#0 0x076751e6 in std::operator<< <char, std::char_traits<char>, std::allocator<char> > () from /usr/lib/libstdc++.so.6
#1 0x0804a19a in Product::send1 (this=0x99170c8, genptr=0x9917020) at ../app/configurator/src/product.cpp:43
#2 0x08049a85 in Generator::test (this=0x9917020) at ../app/generator/src/generator.cpp:60
#3 0x08048f4c in Configure::init (this=0x9917008) at ../app/configurator/src/configurator.cpp:89
#4 0x08048c93 in main (argc=1, argv=0xbfed7364) at ../launch/main/src/appLaunch.cpp:20
(gdb)
Hier ist die valgrind-Ausgabe
valgrind --tool=memcheck --leak-check=yes ./application
==18328== Memcheck, a memory error detector.
==18328== Copyright (C) 2002-2005, and GNU GPL'd, by Julian Seward et al.
==18328== Using LibVEX rev 1575, a library for dynamic binary translation.
==18328== Copyright (C) 2004-2005, and GNU GPL'd, by OpenWorks LLP.
==18328== Using valgrind-3.1.1, a dynamic binary instrumentation framework.
==18328== Copyright (C) 2000-2005, and GNU GPL'd, by Julian Seward et al.
==18328== For more details, rerun with: -v
==18328==
data = HelloWorld
==18328== Invalid read of size 4
==18328== at 0x76751E6: std::basic_ostream<char, std::char_traits<char> >& std::operator<< <char, std::char_traits<char>, std::allocator<char> >(std::basic_ostream<char, std::char_traits<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (in /usr/lib/libstdc++.so.6.0.3)
==18328== by 0x804A199: Product::send1(Generator*) (product.cpp:43)
==18328== by 0x8049A84: Generator::test() (generator.cpp:60)
==18328== by 0x8048F4B: Configure::init() (configurator.cpp:89)
==18328== by 0x8048C92: main (appLaunch.cpp:20)
==18328== Address 0x5C040234 is not stack'd, malloc'd or (recently) free'd
==18328==
==18328== Process terminating with default action of signal 11 (SIGSEGV)
==18328== Access not within mapped region at address 0x5C040234
==18328== at 0x76751E6: std::basic_ostream<char, std::char_traits<char> >& std::operator<< <char, std::char_traits<char>, std::allocator<char> >(std::basic_ostream<char, std::char_traits<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (in /usr/lib/libstdc++.so.6.0.3)
==18328== by 0x804A199: Product::send1(Generator*) (product.cpp:43)
==18328== by 0x8049A84: Generator::test() (generator.cpp:60)
==18328== by 0x8048F4B: Configure::init() (configurator.cpp:89)
==18328== by 0x8048C92: main (appLaunch.cpp:20)
==18328==
==18328== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 17 from 1)
==18328== malloc/free: in use at exit: 159 bytes in 5 blocks.
==18328== malloc/free: 5 allocs, 0 frees, 159 bytes allocated.
==18328== For counts of detected errors, rerun with: -v
==18328== searching for pointers to 5 not-freed blocks.
==18328== checked 116,636 bytes.
Dies ist eigentlich ein Teil einer größeren Anwendung, aber ich habe beraubt die Anwendung und es ganz klein gemacht, so dass ich einfach die debug-Ausgabe aber bereits jetzt, ich habe keine Ahnung, warum dieses Problem auftreten. Mit gdb ich habe versucht, überprüfen Sie die Speicher-layout, sondern vor und nach dem Aufruf der Funktion die Speicher-Adressen und Inhalte sieht intakt. Infact, wenn ich versuche, drucken Sie den Wert von Daten mithilfe von gdb-print-Funktion, es kommt heraus, um korrekt zu sein. Ich habe versucht, viele Dinge wie die Zuteilung von Speicher auf dem heap usw. aber nichts scheint zu funktionieren. Bitten Sie mich führen, wie kann ich debugging starten dieses Problem.
- einige Teile des Codes wäre sehr hilfreich - sind Generator und Produkt im gleichen Projekt? vielleicht einer von Ihnen ist in einer dynamischen Bibliothek?
ja, sowohl Generator und Produkt sind Teil des gleichen Projekts. Ich denke, valgrind verweist auf eine ungültige gelesen, aber ich weiß nicht, wie zu interpretieren und zu Debuggen.
Es ist schwierig, fügen Sie den gesamten code hier ein, da ist es aufgeteilt in verschiedene Dateien. Aber kannst du mir Zeigern wie kann ich das Debuggen mit der Abmahnung durch valgrind.
So weit ich sehe, von dem, was Sie eingefügt haben kann es kein problem im code. Wie man über den build-Prozess? Haben Sie kompilieren und verknüpfen Sie die cpp-Dateien mit dem gleichen compiler-version und den Optionen? Gilt das auch passieren, wenn Sie die Anwendung ausführen ohne debugger?
InformationsquelleAutor vchandra | 2012-01-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wäre es schön, zu sehen, die Deklaration und Implementierung von send1, sehr schwer zu helfen, sonst. Tun Produkt/Generator haben keine virtuellen Funktionen?
Warum schreiben cout << "Data=" << this->Daten - << endl; anstatt nur Daten? Macht das einen Unterschied?
Versuchen Sie, Produkt::send1(Generator* genptr) Produkt::send1(const Generator& gen) und rufen Sie es mit ptr->send1 (*) und sehen, ob das das selbe problem hat.
InformationsquelleAutor TheMathemagician
Meine beste Vermutung ist, dass genptr wurde gelöscht/zerstört, aber der Speicherbereich noch nicht überschrieben wurde durch die Zeit, die Sie drucken den Inhalt von genptr->Daten in den debugger. Jedoch, die ostream
operator<<
Funktion intern weist einige Speicher, und dass nur passiert, um die Wiederverwendung der gleichen Raum, so dass Ihr überschrieben durch die Zeit, die es tatsächlich geht und versucht, drucken Sie die saite, was zu einem Absturz führt.Können Sie dies überprüfen, durch suchen bei der Erinnerung an 0x9917020 (wo genptr Punkte) nach der SEGV und sehen, wenn sein geändert. Sie sollten in der Lage sein zu tun
up
und dannp genptr->data
bei der endgültigen gdb-prompt oben.Hi Chris, wenn ich " up " auf den gdb und die Daten drucken es wird erneut gedruckt. BTW hast du eine Ahnung, was 'Adresse 0x5C040234 nicht stapeln würde, malloc würde oder (vor kurzem) frei würd' gibt? Dieser wird durch die valgrind-Ausgabe. Kann ich einige checkpoint oder irgendetwas, durch das ich verfolgen kann, dieses Problem? Ich weiß nur nicht, wo zu beginnen.
Ich habe noch eine abgespeckte code. Jetzt gibt es eine kleine Anwendung, die zusammen mit zwei anderen statischen Bibliotheken. Es gibt eine Dritte statische Bibliothek, die habe ich nicht verlinkt, aber ich habe herausgefunden, dass sobald ich eine header-Datei von dieser Bibliothek führt zu einem "segmentation fault". Ist es möglich, dass bloß inklusive einer header-Datei, kann es zu einem seg-fault?
InformationsquelleAutor Chris Dodd