J'ai besoin de faire du just in time debugging sous Linux (en gros je veux pouvoir breaker une DLL à un moment précis, i.e. l'équivalent d'un ASSERT(false) sous Windows/Visual Studio.)
J'ai trouvé cette technique mais même avec l'exemple ça n'a pas trop l'air de fonctionner (j'ai remplacé gdb par insight)
Est ce que vous voyez quelque chose qui n'irait pas dans l'exemple ? (ça lance bien insight, mais je ne parviens pas à reprendre l'exécution en pas à pas...)
Sinon y'a pas une autre technique fiable et simple ?
merci d'avance

http://sourceware.org/ml/gdb/2002-06/msg00069.html #include <stdlib.h> #include <unistd.h> #include <sys/wait.h> #include <signal.h> #include <stdio.h> static char* exec_name= "" ; static void crash_handler( int sig ) { //int status= 0 ; int pid ; char* gdb_array[]= {"insight", exec_name, "PID", NULL } ; char pid_str[40] ; sprintf(pid_str, "%d%c", getpid(), '\0') ; gdb_array[2]= pid_str ; pid= fork() ; if ( pid < 0 ) /* error */ abort(); else if ( pid ) { /* parent */ sleep(10); /* Give GDB time to attach */ _exit(1); /* you can skip this line by telling gdb to "return" */ } else /* child */ execvp("insight", gdb_array) ; } void static register_gdb() { signal(SIGQUIT, crash_handler); /* Normally got from Ctrl-\ */ signal(SIGILL, crash_handler); signal(SIGTRAP, crash_handler); signal(SIGABRT, crash_handler); signal(SIGFPE, crash_handler); signal(SIGBUS, crash_handler); signal(SIGSEGV, crash_handler); /* This is the most common crash */ signal(SIGSYS, crash_handler); } void crash_segv( void ) { int *p= 0 ; *p= 1 ; } int main( int argc, char *argv[] ) { exec_name=argv[0] ; register_gdb() ; crash_segv() ; printf("plop") ; return 0 ; }
PS : à mon avis, ça n'a rien à faire dans le forum c/c++, mais je ne sais jamais où mettre ce genre de sujets... (c'est pas de l'algo non plus...)