1

Salut,

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 wink

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...)

2

Tu compiles comment ?

3

gcc -Wall -ggdb jitd.c -o jitd

4

PS : pour ceux qui se demanderaient pourquoi j'ai besoin de Just in time debugging, c'est que je débugue du J2EE côté serveur (le serveur JBOSS tourne sur une machine virtuelle linux) via des sockets depuis Eclipse, que ce code côté serveur lance une autre machine virtuelle java, et que le code exécuté dans cette autre machine virtuelle fait un appel à du JNI triso (et c'est la DLL JNI que j'ai besoin de débugguer couic)

5

KDE a une solution appelée KCrash pour avoir des backtraces au moment du plantage (ils appellent GDB pour créer le backtrace), tu peux regarder comment ils font peut-être.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

6

merci, je regarderai ça demain smile

7

Pen^2 (./4) :
PS : pour ceux qui se demanderaient pourquoi j'ai besoin de Just in time debugging, c'est que je débugue du J2EE côté serveur (le serveur JBOSS tourne sur une machine virtuelle linux) via des sockets depuis Eclipse, que ce code côté serveur lance une autre machine virtuelle java, et que le code exécuté dans cette autre machine virtuelle fait un appel à du JNI triso (et c'est la DLL JNI que j'ai besoin de débugguer couic)

ca me donne la gerbe
Tout ce qui passe pas par le port 80, c'est de la triche.

8

tripo (en fait je ne suis pas pas encore sûr, mais je crois que ça fonctionne (y'a un problème de compilation pour l'instant))

9

(...ça compile... suspens... zzz)

10

rhahahahah !! mad rage vtff
ça fontionne, mais :
q4nT

11