stringstream.str() bricht mit "malloc.c:3801:..." error ab
-
Caligulaminus schrieb:
Zeile 12 ist leer.

kann das sein, dass du irgendwo daten überschreibst ohne die alten daten zu "deleten"?
-
nun eigentlich nicht ich benutze lediglich ein par Vektoren
Diese Objekte werden zur Zeit jedenfalls nach dem erstelle und befüllen mit Daten nicht mehr geändert/gelöscht solange das Programm läuft. Ansonsten gibt es nochDh. Solange das Programm läft wird nicht gelöscht oder hinzugefügt (ausgenommen in der Konfigphase in der aber nur hinzugefügt wird.)
Soll ich die entsprechenden stellen mal heraussuchen und posten?
-
Machst du irgendetwas mit Zeigern?
Mit Iteratoren? Wenn das der Fall, aktiviere mal Iterator-Checking deines Compilers.Edit: Sind die Indices des Arrays gültig?
-
BabCom schrieb:
Soll ich die entsprechenden stellen mal heraussuchen und posten?
ja poste es mal

-
Ich erstelle an einer anderen Stelle(und andere Klasse) ein Array aus 50 uint16_t elementen. Dabei handelt es sich um ein Buffer für die libmodbus rückgaben. zur zeit greife ich aber nur statisch auf die ersten beidne Elemente davon zu. desshalb glaube ich nicht das dort der fehler leigt.(oder?)
-
OK alle stellen der reihe nach und ins abfolge der Klassen:
WatchDog
//includes etc . . . using namespace std; int main(int argc, char* argv[]){ . . .//Variablen und objekte vector<devConfig> dconf;// Die decConfig Objekte in einem Vektor speichern . .//einige ausgaben . //den Vektor befüllen for(int i=0; i<bconf.getDevAnz(); i++) { devConfig myDconf; //dummy objekt anlegen dconf.push_back(myDconf); //objekt in Vektor einfügen config.ReadDevConfig(dconf[i]); //Konfiguration lesen //werte ausgeb nund überprüfen try{ dread.init(mbId, dconf[i].getStartReg(), dconf[i].getRegNo(), dconf[i].getStart(), dconf[i].getOverflow(), dconf[i].getClear(), dconf[i].getAdresse(),dconf[i].getCounter(), dconf[i].getID()); dconf[i].setMbId(mbId); }catch(devReadExcept& dre){ error = dre.get_devReadExcept(eno); cout<<"error ::"<< eno <<"::" << error << endl;; } } //Config stimmt cout<<"/Config"<<endl; . . . + den teil aus posting 1Das ist alles was ich mit dem erste nVektor mache...
-
DevRead.h
#define IBUFSIZE 50 #define MBPORT 502 class devRead { public: . .//einige funktionen . private: int KontextAnz; //Anzahl der benötigten sockets uint16_t *ibuf; // buffer für die werte float fValue; //speicher für die rückgabe struct ipDevNrSockNr{ std::string ip; // ip des DEvices int devNr; // nummer des Devoces int mbId; //zugeordnete socket Nr. }; std::vector<ipDevNrSockNr> ipDevSock;//Speicher für die zuordnungen std::vector<modbus_t*> ctx; //Speicher für die modbus_t strukturen (für den verbindungs aufbau)(libmodbus Kontext) };DevRead.cpp
devRead::devRead() { // TODO Auto-generated constructor stub ibuf = new uint16_t[IBUFSIZE];//IBUFSIZE = 50 } int devRead::init(int &mbId, int startReg, int regAnz, int cRegStart, int cRegOverflow, int cRegClear, std::string ip, int counter, int devNr){ switch (this->mbNr(mbId, ip, devNr)){ case 1:// neue modbus_t Struktur angelegt modbus_t *mb; //ctx ist der Vektor in dem sich die modbus_t Strukturen Befinden mb = modbus_new_tcp(ip.c_str(),MBPORT);//neuen tcp context anlegen ctx.push_back(mb); modbus_connect(ctx[mbId]) == -1){ // verbindung aufbauen throw devReadExcept(modbus_strerror(errno), errno); break;//sonst meckert der eclipse } break; case 0:// verbindung bereits vorhanden break; case -1://fehler aufgetreten return -1; break; } float devRead::readValue(int mbId, int startReg, int regAnz, int cRegStart, int cRegOverflow, int cRegClear, int counter, int devNr){ int rc = 0; switch(counter){ case 0://kein Counter //int retVal = 0; rc = modbus_read_input_registers(ctx[mbId], startReg, regAnz, ibuf); break; case 1://Counter rc = modbus_read_registers(ctx[mbId], startReg, regAnz, ibuf); break; } cout <<"Device "<< devNr << "RAW Data ibuf[0]: "<< ibuf[0]<<" ibuf[1]: "<<ibuf[1]<<endl; fValue = (ibuf[1]*65536)+ibuf[0]; return fValue; };
-
Nathan schrieb:
Edit: Sind die Indices des Arrays gültig?
Ja wiegesagt zur zeit nur statischer zugriff auf die ersten beiden elemente nach dem diese beschrieben wurden.
-
Was ist der Wert von bconf.getDevAnz()?
-
bconf speichert die config werte für das programm(allgeine sachen)
bconf.getDevAnz() gibt die anzahl der sensoren zurück die angeschlossen werden.
(nennen die Sensoren auch device daher das dev ^^)
-
so leute danke für die anregungen aber ich hab jetzt gleich Training alsos nicht wundern wenn ich mich nicht mehr melde.

-
hatt sonst noch wer ne idee worann es leigen könnte?
-
Hast du den Text etwa abgetippt für das Forum? Da fehlen ja teilweise Klammern und Schlüsselwörter, das kann so niemals funktionieren! Siehe:
http://www.c-plusplus.net/forum/304133Ansonsten schließe ich mich mal meinen Vorrednern an. Deine Versicherungen sind ja schön und gut, aber ich möchte das doch lieber von einem Computer bestätigt wissen, ob die verdächtigen Stellen im Programm wirklich korrekt sind. Also:
-ersetze alle new durch vector oder andere STL-Container (
Dies solltest du sowieso tun, ganz unabhängig von der Fehlersuche. Dies erhöht einfach die grundlegende Fehlersicherheit und auch noch den Komfort. Es gibt also keinen Grund, dies nicht zu tun!)
-Aktiviere dann beim Übersetzen den Debugmodus deiner STL
-???
-Profit!Da du anscheinend unter Linux entwickelst, empfehle ich auch mal valgrind. Damit findet man schnelle sehr viele Fehler dieser Art. Programm mit Debugsymbolen erstellen, dann mal wie folgt aufrufen:
valgrind --tool=memcheck --leak-check=yes --show-reachable=yes --num-callers=20 --track-fds=yes dein_programm
-
Hi Ich habe mir deinen tipp alle news durch stl funktionen zu ersetzen bereits zu herzen genommen (bis auf eine ausnahme Arbeite ich nur noch mit stl funktionen). danke für den tipp mit Valgrind. Ich habe bereits öfters davon gelesen es aber noch nie selbst benutzt.
Ich bin grade dabei das Tool zu installieren...Edit:
... Valgrind is drauf.
jedoch startet er valgrind nicht mit volgender Fehlermeldung:
valgrind : watchdog: command not foundich Kompiliere das mit folgenden angaben
g++ -o watchdog -g -O0 -Wall xyz.cpp...ich befinde mich in der Konsole im Programmverzeichniss
was mache ich falsch?
gefunden ./watchdog zum aufrufen
-
So hab valgrind ausgeführt und folgendes Log erhalten.
==7058== Memcheck, a memory error detector ==7058== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al. ==7058== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info ==7058== Command: ./watchdog ==7058== Das Programm WatchDog wird Manuell ausgeführt. Bitte die Konfiguration bestätigen. Config Box-ID : 1 Device Anzahl : 4 Logfile Intervall : 15 int Minuten Wenn alles stimmt bitte mit Enter bestaetigen ansonsten Str+C druecken. counter : 0 Device Nr. : 1: Adresse : 192.168.0.50 Start Register : 1 Register Anzahl : 1 ID des Device : 1 Umrechnungsfaktor : /100-50 Device Intervall : 1 in Minuten Wenn alles stimmt bitte mit Enter bestaetigen ansonsten Str+C druecken. ==7058== Invalid read of size 4 ==7058== at 0x805042C: devRead::mbNr(int&, std::string, int) (devRead.cpp:120) ==7058== by 0x804FB87: devRead::init(int&, int, int, int, int, int, std::string, int, int) (devRead.cpp:28) ==7058== by 0x8052727: main (watchDog.cpp:122) ==7058== Address 0x4336854 is 8 bytes after a block of size 12 alloc'd ==7058== at 0x402B9B4: operator new(unsigned int) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) ==7058== by 0x80519B5: __gnu_cxx::new_allocator<devRead::ipDevNrSockNr>::allocate(unsigned int, void const*) (new_allocator.h:92) ==7058== by 0x8051765: std::_Vector_base<devRead::ipDevNrSockNr, std::allocator<devRead::ipDevNrSockNr> >::_M_allocate(unsigned int) (in /home/babcom/ELMOS/test/src/watchdog) ==7058== by 0x80510DB: std::vector<devRead::ipDevNrSockNr, std::allocator<devRead::ipDevNrSockNr> >::_M_insert_aux(__gnu_cxx::__normal_iterator<devRead::ipDevNrSockNr*, std::vector<devRead::ipDevNrSockNr, std::allocator<devRead::ipDevNrSockNr> > >, devRead::ipDevNrSockNr const&) (vector.tcc:327) ==7058== by 0x8050A20: std::vector<devRead::ipDevNrSockNr, std::allocator<devRead::ipDevNrSockNr> >::push_back(devRead::ipDevNrSockNr const&) (stl_vector.h:834) ==7058== by 0x8050406: devRead::mbNr(int&, std::string, int) (devRead.cpp:118) ==7058== by 0x804FB87: devRead::init(int&, int, int, int, int, int, std::string, int, int) (devRead.cpp:28) ==7058== by 0x8052727: main (watchDog.cpp:122) ==7058== Device 1 eingerichtet. counter : 0 Device Nr. : 2: Adresse : 192.168.0.50 Start Register : 5 Register Anzahl : 1 ID des Device : 2 Umrechnungsfaktor : /100-50 Device Intervall : 1 in Minuten Wenn alles stimmt bitte mit Enter bestaetigen ansonsten Str+C druecken. Device 2 eingerichtet. counter : 1 Device Nr. : 3: Adresse : 192.168.0.100 Start Register : 24 Register Anzahl : 2 ID des Device : 3 Umrechnungsfaktor : /1000 Device Intervall : 1 in Minuten Counter Start Reg : 80 Counter Clear Reg : 81 Counter overflow Reg : 82 Counter DILatch Reg : 83 Wenn alles stimmt bitte mit Enter bestaetigen ansonsten Str+C druecken. Device 3 eingerichtet. counter : 1 Device Nr. : 4: Adresse : 192.168.0.100 Start Register : 26 Register Anzahl : 2 ID des Device : 4 Umrechnungsfaktor : /1000 Device Intervall : 1 in Minuten Counter Start Reg : 84 Counter Clear Reg : 85 Counter overflow Reg : 86 Counter DILatch Reg : 87 Wenn alles stimmt bitte mit Enter bestaetigen ansonsten Str+C druecken. Device 4 eingerichtet. /Config ==7058== Conditional jump or move depends on uninitialised value(s) ==7058== at 0x804EFCE: dataWrite::header(int) (dataWrite.cpp:45) ==7058== by 0x80528A9: main (watchDog.cpp:157) ==7058== ==7058== Conditional jump or move depends on uninitialised value(s) ==7058== at 0x804F006: dataWrite::header(int) (dataWrite.cpp:32) ==7058== by 0x80528A9: main (watchDog.cpp:157) ==7058== Neues Logfile erstellt ==7058== Invalid write of size 2 ==7058== at 0x804FB38: devRead::ibufZERO() (devRead.cpp:21) ==7058== by 0x80500D2: devRead::readValue(int, int, int, int, int, int, int, int) (devRead.cpp:79) ==7058== by 0x8052A79: main (watchDog.cpp:168) ==7058== Address 0x433624c is 0 bytes after a block of size 100 alloc'd ==7058== at 0x402B454: operator new[](unsigned int) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) ==7058== by 0x804FAE1: devRead::devRead() (devRead.cpp:16) ==7058== by 0x8051F1A: main (watchDog.cpp:76) ==7058== Device 3RAW Data ibuf[0]: 49 ibuf[1]: 0 3: 0 Device 4RAW Data ibuf[0]: 1868 ibuf[1]: 0 4: 1 Device 1RAW Data ibuf[0]: 8028 ibuf[1]: 0 1: 30 Device 2RAW Data ibuf[0]: 7486 ibuf[1]: 0 2: 24 Device 1RAW Data ibuf[0]: 8028 ibuf[1]: 0 1: 30 Device 2RAW Data ibuf[0]: 7491 ibuf[1]: 0 2: 24 Device 3RAW Data ibuf[0]: 49 ibuf[1]: 0 3: 0 Device 4RAW Data ibuf[0]: 1868 ibuf[1]: 0 4: 1 Device 2RAW Data ibuf[0]: 7491 ibuf[1]: 0 2: 24 Device 3RAW Data ibuf[0]: 49 ibuf[1]: 0 3: 0 Device 4RAW Data ibuf[0]: 1868 ibuf[1]: 0 4: 1 Device 1RAW Data ibuf[0]: 8022 ibuf[1]: 0 1: 30 ^C==7058== ==7058== FILE DESCRIPTORS: 7 open at exit. ==7058== Open file descriptor 6: Logfile 19 :36 03. 12. 2013 .xml ==7058== at 0x4239D43: __open_nocancel (syscall-template.S:82) ==7058== by 0x41CCACB: _IO_file_open (fileops.c:233) ==7058== by 0x41CCC87: _IO_file_fopen@@GLIBC_2.1 (fileops.c:338) ==7058== by 0x41C0D86: __fopen_internal (iofopen.c:93) ==7058== by 0x41C354A: fopen64 (iofopen64.c:39) ==7058== by 0x40B75BE: std::__basic_file<char>::open(char const*, std::_Ios_Openmode, int) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16) ==7058== by 0x40BAB37: std::basic_filebuf<char, std::char_traits<char> >::open(char const*, std::_Ios_Openmode) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16) ==7058== by 0x40BD204: std::basic_fstream<char, std::char_traits<char> >::open(char const*, std::_Ios_Openmode) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16) ==7058== by 0x80528A9: main (watchDog.cpp:157) ==7058== ==7058== Open AF_INET socket 5: 192.168.0.20:37119 <-> 192.168.0.100:502 ==7058== at 0x424C867: socket (socket.S:64) ==7058== by 0x40526A1: _modbus_tcp_connect (modbus-tcp.c:254) ==7058== by 0x404F48F: modbus_connect (modbus.c:1499) ==7058== by 0x8052727: main (watchDog.cpp:122) ==7058== ==7058== Open AF_INET socket 4: 192.168.0.20:32935 <-> 192.168.0.50:502 ==7058== at 0x424C867: socket (socket.S:64) ==7058== by 0x40526A1: _modbus_tcp_connect (modbus-tcp.c:254) ==7058== by 0x404F48F: modbus_connect (modbus.c:1499) ==7058== by 0x8052727: main (watchDog.cpp:122) ==7058== ==7058== Open file descriptor 3: konfig.xml ==7058== at 0x4239D43: __open_nocancel (syscall-template.S:82) ==7058== by 0x41CCACB: _IO_file_open (fileops.c:233) ==7058== by 0x41CCC87: _IO_file_fopen@@GLIBC_2.1 (fileops.c:338) ==7058== by 0x41C0D86: __fopen_internal (iofopen.c:93) ==7058== by 0x41C354A: fopen64 (iofopen64.c:39) ==7058== by 0x40B75BE: std::__basic_file<char>::open(char const*, std::_Ios_Openmode, int) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16) ==7058== by 0x40BAB37: std::basic_filebuf<char, std::char_traits<char> >::open(char const*, std::_Ios_Openmode) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16) ==7058== by 0x40BBD37: std::basic_ifstream<char, std::char_traits<char> >::open(char const*, std::_Ios_Openmode) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16) ==7058== by 0x8051EFE: main (watchDog.cpp:74) ==7058== ==7058== Open file descriptor 2: /dev/pts/0 ==7058== <inherited from parent> ==7058== ==7058== Open file descriptor 1: /dev/pts/0 ==7058== <inherited from parent> ==7058== ==7058== Open file descriptor 0: /dev/pts/0 ==7058== <inherited from parent> ==7058== ==7058== ==7058== HEAP SUMMARY: ==7058== in use at exit: 19,000 bytes in 24 blocks ==7058== total heap usage: 323 allocs, 299 frees, 63,882 bytes allocated ==7058== ==7058== 8 bytes in 1 blocks are still reachable in loss record 1 of 17 ==7058== at 0x402B9B4: operator new(unsigned int) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) ==7058== by 0x80518EB: __gnu_cxx::new_allocator<_modbus*>::allocate(unsigned int, void const*) (new_allocator.h:92) ==7058== by 0x80515B7: std::_Vector_base<_modbus*, std::allocator<_modbus*> >::_M_allocate(unsigned int) (in /home/babcom/ELMOS/test/src/watchdog) ==7058== by 0x8050D7E: std::vector<_modbus*, std::allocator<_modbus*> >::_M_insert_aux(__gnu_cxx::__normal_iterator<_modbus**, std::vector<_modbus*, std::allocator<_modbus*> > >, _modbus* const&) (vector.tcc:327) ==7058== by 0x8050978: std::vector<_modbus*, std::allocator<_modbus*> >::push_back(_modbus* const&) (stl_vector.h:834) ==7058== by 0x804FBE2: devRead::init(int&, int, int, int, int, int, std::string, int, int) (devRead.cpp:33) ==7058== by 0x8052727: main (watchDog.cpp:122) ==7058== ==7058== 31 bytes in 1 blocks are possibly lost in loss record 2 of 17 ==7058== at 0x402B9B4: operator new(unsigned int) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) ==7058== by 0x40E87D3: std::string::_Rep::_S_create(unsigned int, unsigned int, std::allocator<char> const&) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16) ==7058== by 0x13795007: ??? ==7058== ==7058== 31 bytes in 1 blocks are possibly lost in loss record 3 of 17 ==7058== at 0x402B9B4: operator new(unsigned int) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) ==7058== by 0x40E87D3: std::string::_Rep::_S_create(unsigned int, unsigned int, std::allocator<char> const&) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16) ==7058== by 0x13795003: ??? ==7058== ==7058== 37 bytes in 1 blocks are possibly lost in loss record 4 of 17 ==7058== at 0x402B9B4: operator new(unsigned int) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) ==7058== by 0x40E87D3: std::string::_Rep::_S_create(unsigned int, unsigned int, std::allocator<char> const&) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16) ==7058== by 0x146B0BD: ??? ==7058== ==7058== 40 bytes in 2 blocks are still reachable in loss record 5 of 17 ==7058== at 0x402BE68: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) ==7058== by 0x405314A: modbus_new_tcp (modbus-tcp.c:664) ==7058== by 0x8052727: main (watchDog.cpp:122) ==7058== ==7058== 45 bytes in 1 blocks are possibly lost in loss record 6 of 17 ==7058== at 0x402B9B4: operator new(unsigned int) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) ==7058== by 0x40E87D3: std::string::_Rep::_S_create(unsigned int, unsigned int, std::allocator<char> const&) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16) ==7058== by 0x40EA7B7: char* std::string::_S_construct<char*>(char*, char*, std::allocator<char> const&, std::forward_iterator_tag) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16) ==7058== by 0x40EA88F: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string<char*>(char*, char*, std::allocator<char> const&) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16) ==7058== by 0x3: ??? ==7058== by 0x30203632: ??? ==7058== ==7058== 48 bytes in 1 blocks are still reachable in loss record 7 of 17 ==7058== at 0x402B9B4: operator new(unsigned int) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) ==7058== by 0x80519B5: __gnu_cxx::new_allocator<devRead::ipDevNrSockNr>::allocate(unsigned int, void const*) (new_allocator.h:92) ==7058== by 0x8051765: std::_Vector_base<devRead::ipDevNrSockNr, std::allocator<devRead::ipDevNrSockNr> >::_M_allocate(unsigned int) (in /home/babcom/ELMOS/test/src/watchdog) ==7058== by 0x80510DB: std::vector<devRead::ipDevNrSockNr, std::allocator<devRead::ipDevNrSockNr> >::_M_insert_aux(__gnu_cxx::__normal_iterator<devRead::ipDevNrSockNr*, std::vector<devRead::ipDevNrSockNr, std::allocator<devRead::ipDevNrSockNr> > >, devRead::ipDevNrSockNr const&) (vector.tcc:327) ==7058== by 0x8050A20: std::vector<devRead::ipDevNrSockNr, std::allocator<devRead::ipDevNrSockNr> >::push_back(devRead::ipDevNrSockNr const&) (stl_vector.h:834) ==7058== by 0x8050597: devRead::mbNr(int&, std::string, int) (devRead.cpp:144) ==7058== by 0x804FB87: devRead::init(int&, int, int, int, int, int, std::string, int, int) (devRead.cpp:28) ==7058== by 0x8052727: main (watchDog.cpp:122) ==7058== ==7058== 62 bytes in 2 blocks are possibly lost in loss record 8 of 17 ==7058== at 0x402B9B4: operator new(unsigned int) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) ==7058== by 0x40E87D3: std::string::_Rep::_S_create(unsigned int, unsigned int, std::allocator<char> const&) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16) ==7058== by 0x134FF403: ??? ==7058== ==7058== 80 bytes in 2 blocks are still reachable in loss record 9 of 17 ==7058== at 0x402BE68: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) ==7058== by 0x4053125: modbus_new_tcp (modbus-tcp.c:656) ==7058== by 0x8052727: main (watchDog.cpp:122) ==7058== ==7058== 100 bytes in 1 blocks are still reachable in loss record 10 of 17 ==7058== at 0x402B454: operator new[](unsigned int) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) ==7058== by 0x804FAE1: devRead::devRead() (devRead.cpp:16) ==7058== by 0x8051F1A: main (watchDog.cpp:76) ==7058== ==7058== 140 bytes in 4 blocks are possibly lost in loss record 11 of 17 ==7058== at 0x402B9B4: operator new(unsigned int) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) ==7058== by 0x40E87D3: std::string::_Rep::_S_create(unsigned int, unsigned int, std::allocator<char> const&) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16) ==7058== by 0x134FF4BD: ??? ==7058== ==7058== 240 bytes in 1 blocks are still reachable in loss record 12 of 17 ==7058== at 0x402B9B4: operator new(unsigned int) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) ==7058== by 0x8053D10: __gnu_cxx::new_allocator<devConfig>::allocate(unsigned int, void const*) (new_allocator.h:92) ==7058== by 0x8053B8D: std::_Vector_base<devConfig, std::allocator<devConfig> >::_M_allocate(unsigned int) (in /home/babcom/ELMOS/test/src/watchdog) ==7058== by 0x80536D5: std::vector<devConfig, std::allocator<devConfig> >::_M_insert_aux(__gnu_cxx::__normal_iterator<devConfig*, std::vector<devConfig, std::allocator<devConfig> > >, devConfig const&) (vector.tcc:327) ==7058== by 0x8053356: std::vector<devConfig, std::allocator<devConfig> >::push_back(devConfig const&) (stl_vector.h:834) ==7058== by 0x80520C6: main (watchDog.cpp:96) ==7058== ==7058== 352 bytes in 1 blocks are still reachable in loss record 13 of 17 ==7058== at 0x402BE68: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) ==7058== by 0x41C0D17: __fopen_internal (iofopen.c:76) ==7058== by 0x41C354A: fopen64 (iofopen64.c:39) ==7058== by 0x40B75BE: std::__basic_file<char>::open(char const*, std::_Ios_Openmode, int) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16) ==7058== by 0x40BAB37: std::basic_filebuf<char, std::char_traits<char> >::open(char const*, std::_Ios_Openmode) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16) ==7058== by 0x40BBD37: std::basic_ifstream<char, std::char_traits<char> >::open(char const*, std::_Ios_Openmode) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16) ==7058== by 0x8051EFE: main (watchDog.cpp:74) ==7058== ==7058== 352 bytes in 1 blocks are still reachable in loss record 14 of 17 ==7058== at 0x402BE68: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) ==7058== by 0x41C0D17: __fopen_internal (iofopen.c:76) ==7058== by 0x41C354A: fopen64 (iofopen64.c:39) ==7058== by 0x40B75BE: std::__basic_file<char>::open(char const*, std::_Ios_Openmode, int) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16) ==7058== by 0x40BAB37: std::basic_filebuf<char, std::char_traits<char> >::open(char const*, std::_Ios_Openmode) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16) ==7058== by 0x40BD204: std::basic_fstream<char, std::char_traits<char> >::open(char const*, std::_Ios_Openmode) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16) ==7058== by 0x80528A9: main (watchDog.cpp:157) ==7058== ==7058== 525 bytes in 1 blocks are possibly lost in loss record 15 of 17 ==7058== at 0x402B9B4: operator new(unsigned int) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) ==7058== by 0x40E87D3: std::string::_Rep::_S_create(unsigned int, unsigned int, std::allocator<char> const&) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16) ==7058== by 0x844D1F07: ??? ==7058== ==7058== 525 bytes in 1 blocks are possibly lost in loss record 16 of 17 ==7058== at 0x402B9B4: operator new(unsigned int) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) ==7058== by 0x40E87D3: std::string::_Rep::_S_create(unsigned int, unsigned int, std::allocator<char> const&) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16) ==7058== by 0x98DADF03: ??? ==7058== ==7058== 16,384 bytes in 2 blocks are still reachable in loss record 17 of 17 ==7058== at 0x402B454: operator new[](unsigned int) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) ==7058== by 0x40B9C42: std::basic_filebuf<char, std::char_traits<char> >::_M_allocate_internal_buffer() (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16) ==7058== ==7058== LEAK SUMMARY: ==7058== definitely lost: 0 bytes in 0 blocks ==7058== indirectly lost: 0 bytes in 0 blocks ==7058== possibly lost: 1,396 bytes in 12 blocks ==7058== still reachable: 17,604 bytes in 12 blocks ==7058== suppressed: 0 bytes in 0 blocks ==7058== ==7058== For counts of detected and suppressed errors, rerun with: -v ==7058== Use --track-origins=yes to see where uninitialised values come from ==7058== ERROR SUMMARY: 23 errors from 12 contexts (suppressed: 0 from 0)Kann mir wer erklähren wie ich das zu interpretieren habe?
-
SeppJ schrieb:
...
erstellen, dann mal wie folgt aufrufen:valgrind --tool=memcheck --leak-check=yes --show-reachable=yes --num-callers=20 --track-fds=yes dein_programmDanke für den tipp und deine Hilfe.
Ich habe angefangen die Fehler zu beseitigen.echt vielen dank an alle die mir geholfen haben

Mfg BabCom
PS: ich meld mich wieder wenn ich nicht mehr weiter komme

-
Ich nehme mal nur die erste Meldung, denn spätere Fehler sind oft eine Folge vorheriger Fehler. Falls nach Beheben des ersten Fehlers die anderen trotzdem noch auftreten, dann kann man sich um diese kümmern:
==7058== Invalid read of size 4 ==7058== at 0x805042C: devRead::mbNr(int&, std::string, int) (devRead.cpp:120) ==7058== by 0x804FB87: devRead::init(int&, int, int, int, int, int, std::string, int, int) (devRead.cpp:28) ==7058== by 0x8052727: main (watchDog.cpp:122) ==7058== Address 0x4336854 is 8 bytes after a block of size 12 alloc'd ==7058== at 0x402B9B4: operator new(unsigned int) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) ==7058== by 0x80519B5: __gnu_cxx::new_allocator<devRead::ipDevNrSockNr>::allocate(unsigned int, void const*) (new_allocator.h:92) ==7058== by 0x8051765: std::_Vector_base<devRead::ipDevNrSockNr, std::allocator<devRead::ipDevNrSockNr> >::_M_allocate(unsigned int) (in /home/babcom/ELMOS/test/src/watchdog) ==7058== by 0x80510DB: std::vector<devRead::ipDevNrSockNr, std::allocator<devRead::ipDevNrSockNr> >::_M_insert_aux(__gnu_cxx::__normal_iterator<devRead::ipDevNrSockNr*, std::vector<devRead::ipDevNrSockNr, std::allocator<devRead::ipDevNrSockNr> > >, devRead::ipDevNrSockNr const&) (vector.tcc:327) ==7058== by 0x8050A20: std::vector<devRead::ipDevNrSockNr, std::allocator<devRead::ipDevNrSockNr> >::push_back(devRead::ipDevNrSockNr const&) (stl_vector.h:834) ==7058== by 0x8050406: devRead::mbNr(int&, std::string, int) (devRead.cpp:118) ==7058== by 0x804FB87: devRead::init(int&, int, int, int, int, int, std::string, int, int) (devRead.cpp:28) ==7058== by 0x8052727: main (watchDog.cpp:122) ==7058==Das heißt, der Fehler tritt in Zeile 120 der devRead.cpp auf, in der Funktion devRead::mbNr(int&, std::string, int). Da drunter steht, von wo aus diese Funktion aufgerufen wurde. Sie wurde also von devRead::init(int&, int, int, int, int, int, std::string, int, int) aufgerufen, welche wiederum von main aufgerufen wurde (jeweils mit Zeilennummer des Aufrufs). Der Fehler selbst, Invalid read of size 4, bedeutet, dass 4 Byte (möglicherweise ein int?) gelesen wurden von einer Stelle, wo dein Programm normalerweise nicht lesen dürfte. valgrind fiel dazu auf, dass diese Stelle aber nur 8 Bytes hinter einer Stelle ist, die von deinem Programm allokiert wurde. Dies deutet stark da drauf hin, dass du hinter den letzten Index eines Arrays/Vectors (oder ähnliche Datenstruktur) zugreifst. Da valgrind auch noch auflistet, wie dieser Bereich reserviert wurde (main ruft devRead::init auf, ruft devRead::mbNr auf, ruft vector::push_back auf, welches dann nach ein paar Astraktionsschichten den Speicher reserviert), bestätigt dies, dass in der Funktion devRead::mbNr ein vector gefüllt wurde, aber dann hinter den letzten gültigen Index zugegriffen wurde.
Da du weder den Code von devRead::mbNr zeigst, noch in devRead::init überhaupt ein Aufruf einer solchen Funktion zu sehen ist, nehme ich mal an, dass diese Funktion entweder neu ist oder du vorher zu viel von deinem Code gekürzt hast. Jedenfalls kann ich ohne Code nicht auf den konkreten Fehler zeigen.
-
Hi,
Sorry das ich das erst jetzt schreibe, Ich hab seit längeren nicht mehr vorbeigeschaut.
Zu deiner anmerkung:
Ja da habe ich etwas zu stark gekürtzt.
Dank des einsatzes von Valgrind habe ich die Fehler mittlerweile alle gefunden und beseitigt. Meine Programm Läuft entlich.
Also an diesme punkt noch mal Danke für die Hilfe an alle.Mfg BabCom