Sto tentando di creare un hook sulla funzione di sistema open()
. L'ho fatto seguendo le linee seguenti.Errore di segmentazione dal gancio aperto()
Ho creato una libreria wrapper con il seguente:
extern int mocked_open(const char* fn, int flags, va_list args);
int open(const char* fn, int flags, ...)
{
int r = -1;
va_list args;
va_start(args, flags);
r = mocked_open(fn, flags, args);
va_end(args);
return r;
}
compilo questo in libwrapper.so, che mi carico con LD_PRELOAD.
L'attuazione di mocked_open()
è la seguente (io uso il quadro CPPUtest):
int mocked_open(const char* fn, int flags, va_list args)
{
if (strncmp(fn, test_device_id, 11) == 0)
{
return mock().actualCall("open").returnValue().getIntValue();
}
else
{
int r = -1;
int (*my_open)(const char*, int, ...);
void* fptr = dlsym(RTLD_NEXT, "open");
memcpy(&my_open, &fptr, sizeof(my_open));
if (flags & O_CREAT)
{
r = my_open(fn, flags, va_arg(args, mode_t));
}
else
{
r = my_open(fn, flags);
}
return r;
}
}
Il test_device_id
è una semplice stringa ("test_device"), che spero non viene utilizzato altrove.
Durante l'esecuzione dei test, l'eseguibile si arresta in modo anomalo con un errore di segmentazione. Ho tracciato questo verso la funzionalità di profilazione GCC, che vuole aprire/creare un gruppo di file .gcda
e chiama open()
per questo.
Dopo un po 'di debug con strace (per suggerimento sotto), ho trovato che la riga r = my_open(fn, flags, va_arg(args, mode_t));
è effettivamente il colpevole. Viene chiamato ricorsivamente, o così sembra: vedo molte chiamate a questa linea, senza che la funzione ritorni. Quindi un segfault. Il file che si sta aprendo è il corrispondente file .gcda (per la profilazione). In effetti, il segfault si verifica solo con il profilo abilitato.
Penso che il tuo problema sia la gestione variadica http://stackoverflow.com/questions/150543/forward-an-invocation-of-a-variadic-function-in-c – user590028
@ user590028: puoi elaborare? Ho pensato che ci fosse qualcosa di sbagliato nella gestione degli argomenti variadici (come ho scritto), ma cosa ...? – Ludo
Che tipo di chiamate a 'open()' fa 'strace' show è usato nei tuoi casi di test? – alk