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.

gut zu wissen, dass Sie es geschafft, den Streifen der Anwendung, aber Sie haben vergessen, die Quelle code.
- 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

Schreibe einen Kommentar