Programm beendet sich ohne Fehlermeldung oder Stacktrace
-
Ich will gerade einen Socks5 server Implementieren und bin da halt dran. Ist nichts optimiertes oder jetzt sehr gut Strukturiertes. Das ganze benutzt libevent.
main methode ist nichts besonderes aber hier:
int main(int ac, char **av) { #ifndef NDEBUG Util::msg_out(norm, "Starting in debug mode\n"); #endif Server * s = new Server(); s->setup(); bool running = true; while(running){ event_base_dispatch(s->eb); } }
Aug 10 22:32:06 server.out: Read 14 bytes from client
Aug 10 22:32:06 server.out: Reading password and username
Aug 10 22:32:06 server.out: Have 5 bytes of username
Aug 10 22:32:06 server.out: Have 6 bytes of password
Aug 10 22:32:06 server.out: Username: lukas, Password: lukass
Aug 10 22:32:06 server.out: Login succeeded for u: lukas p: lukass
Aug 10 22:32:06 server.out: Server Event occured
Aug 10 22:32:06 server.out: Reading from client
Aug 10 22:32:06 server.out: Read 10 bytes from client
Aug 10 22:32:06 server.out: Read port: 12766
Aug 10 22:32:06 server.out: Connecting to IPv4 address: 192.168.1.105
Aug 10 22:32:06 server.out: Server Event occured
Aug 10 22:32:06 server.out: Reading from client
Aug 10 22:32:06 server.out: Relaying data
Aug 10 22:32:06 server.out: readAllFromClient: reading 82 bytes
Aug 10 22:32:06 server.out: Read 82 bytes from client
Aug 10 22:32:06 server.out: before crash?das hier ist mein debug output, man sieht das Ichs von den text messages schon ganz gut isolieren kann wo ungefähr.
case RELAY: Util::msg_out(debug,"Relaying data"); //case REPLY: if( readAllFromClient(fd,&readBytes,buffer) >= 0 ){ Util::msg_out(debug,"before crash?"); sendToClient(it->second.fd,buffer,readBytes); Util::msg_out(debug,"Sent to client"); delete[] buffer; } break;
int Server::sendToClient(int fd, uint8_t * buffer, int32_t bufferSize ){ int32_t sentBytes = send(fd,buffer,bufferSize,0); if( sentBytes != bufferSize){ Util::msg_out(warn,"Couldn't send whole buffer"); return -1; } if( sentBytes < 0 ){ Util::msg_out(crit,"Couldn't send data"); return -1; } if( sentBytes == 0 ){ Util::msg_out(debug,"Sending on closed socket, abandoning client"); abandonClient(fd); return -1; } return 0; }
bin gerade etwas verblüfft wie das ganze passiert, gibt es noch error logs die ich auslasse wo ich dazu mehr info kriegen könnte? kennt ihr eine gute IDE auf linux mit debugger bei der ich vielleicht mit breakpoints arbeiten könnte?
Bin für jede Hilfe dankbar !
-
dein problem ist mir etwas zu abstrakt. Aber da du herausfinden willst wo dein crash passiert, nimm mal valgrind!
ansonsten ist gdb der Debugger der Wahl.
-
Danke, von valgrind hab ich schonmal einen output der ziemlich gut aussieht ! Vielen Dank
-- Hab mein Problem gefunden, lag daran das Ich einen Teil von Pointern missverstanden hab. Anfänger Fehler :x
falls es wen interessiert, vielleicht will das ja selber mal jemand vermeiden aber geht wohl eher hier im täglichen Durchsatz unter.
Fehlerhaftes Beispiel:
void function ( char * buffer ){ buffer = new char[100]; } char * buffer; function(buffer); // die speicher addresse in buffer ist nach dem funktionsaufruf nicht in dem buffer des übergeornetem scopes. memset(buffer,10,0);
funktionierendes beispiel:
void function ( char ** buffer ){ *buffer = new char[100]; } char ** buffer; function(buffer); // die speicher addresse in buffer ist nach dem funktionsaufruf nicht in dem buffer des übergeornetem scopes. memset(*buffer,0,10);
Übrigens schön das es euch noch gibt! War das erste mal hier vor 10 Jahren und hab um Hilfe gefragt !
-
und vielleicht habe ich dir vor 10 Jahren schonmal geantwortet
-
Wenn du C++ machst, wieso dann überhaupt new für irgendwas? Und so viele Pointer? C++ ist nicht Java. Mit idiomatischem C++ entfallen solche Probleme ganz von alleine.
-
Ich mag pointer.
-
CookieB schrieb:
Ich mag pointer.
Ich auch.
Man muss eben nur sehr sorgfältig programmieren. Old school und so.
-
CookieB schrieb:
Ich mag pointer.
Dann ist es ein selbst gemachtes Problem. Insbesondere wenn man von sich selber sagt
lag daran das Ich einen Teil von Pointern missverstanden hab
EOP schrieb:
Man muss eben nur sehr sorgfältig programmieren. Old school und so.
Darfst du gerne tun, aber es sollte zumindest ein jeder wissen, dass man sich damit das Leben selber unnötig schwer macht. Manche Leute bekommen Pointergefrickel tatsächlich so beigebracht und kennen gar nichts anderes. Einem Zivilisationsflüchtling mag ich mich nicht aufdrängen (der ist selber schuld :p ), aber dem armen Wilden aus dem Amazonasdschungel kann man schon mal erzählen, dass er nicht mit 14 an Bilddarmentzündung sterben braucht, wenn er nicht möchte
-
Stört doch keinen ist ja hobby. Hab ja gute hilfe gekriegt.
-
SeppJ schrieb:
Darfst du gerne tun, aber es sollte zumindest ein jeder wissen, dass man sich damit das Leben selber unnötig schwer macht.
Macht es nicht - es macht Spaß!
-
EOP schrieb:
SeppJ schrieb:
Darfst du gerne tun, aber es sollte zumindest ein jeder wissen, dass man sich damit das Leben selber unnötig schwer macht.
Macht es nicht - es macht Spaß!
Vieles, was unnötig schwer ist, macht manchen Menschen Spaß. Kann schon sein. Aber dass es unnötig schwer ist, ist trotzdem nicht zu leugnen. ~(Falls es sich um produktive Arbeit handeln sollte, wäre es sogar fahrlässig und Verschwendung. Also bitte nur als Hobby!)~
-
Habe den produktiven Zweig schon vor einer Weile gekappt.
Nur noch Hobby und Spaß und schmutzige Sachen.
-
Dann kann man auch so ehrlich sein und direkt C verwenden. Das ist noch ein kleines bisschen schneller und kompiliert vor allem rasend schnell. Und man bekommt vom "Zivilisierten Mann" (Imperialist :p) keine bösen Blicke zugeworfen, weil er Pointermagie eh nicht versteht.
Dein Code als Einliner in C:
char*buffer = calloc(100,1);
Übrigens, wenn ich recht in der Annahme gehe, dass das Code für
recv
werden soll - das memset lässt du dann direkt am Besten. Anfängerfehler, weil man meint, dass man ja eh nur Daten != 0 zurückbekommt, und wenn man strlen macht, klappt das dann. Die Länge bekommst du aber vom Kernel, der Rückgabewert vonrecv
.ssize_t length_cur = 0; /*WARUM zum Teufel ein ssize_t? errno setzen ging nicht oder was?*/ size_t length_all = 0; do { /*Timeout-Handling*/ /*Prüfen, ob noch Buffer da ist*/ /*Prüfung auf <1 - 0 wäre OK, wenn kein Timeout-Handling gemacht werden würde, aber dann **läuft deine CPU ja nur noch in der Loop. Und -1 ist halt Fehler (deswegen, warum nicht errno **setzen?)*/ if((lengh_cur = recv(socket,buffer + length_all,length_all - buffer_length)) < 1) { /*Fehlerhandling*/ } length_cur += length_all; /*Und hier halt eine Prüfung, ob du noch Bytes benötigst oder ob es dies war.*/ }
-
Ich wusste, ich hab was übersehen - Zeile 12 sollte sein:
buffer_length - length_all
-
Altes, ich geb auf - das ist Copy-Paste-Code, und ich Dämlack bekomme nur die Variablennamen falsch ersetzt.
length_all += length_cur;
Wie schwer ist es, eine ordentliche Substitution hinzubekommen?!