Sto provando a rintracciare un crash molto strano. Ciò che è così strano è una soluzione che qualcuno ha scoperto e che non posso spiegare.come può cambiare il comportamento del programma eseguito
La soluzione è questo piccolo programma che mi riferisco a come 'runner':
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
int main(int argc, char *argv[])
{
if (argc == 1)
{
fprintf(stderr, "Usage: %s prog [args ...]\n", argv[0]);
return 1;
}
execvp(argv[1], argv + 1);
fprintf(stderr, "execv failed: %s\n", strerror(errno));
// If exec returns because the program is not found or we
// don't have the appropriate permission
return 255;
}
Come si può vedere, tutto questo programma non fa altro che utilizzare execvp
a sostituire se stesso con un programma diverso.
il programma si blocca quando viene direttamente richiamato dalla riga di comando:
/path/to/prog args # this crashes
ma funziona bene quando è indirettamente richiamato tramite il mio corridore spessore:
/path/to/runner /path/to/prog args # works successfully
Per la vita di me, Posso capire come avere un exec in più può cambiare il comportamento del programma in esecuzione (come si può vedere il programma non cambia l'ambiente).
Alcuni dati sullo schianto. Lo stesso crash si sta verificando nel runtime di C++. In particolare, quando il programma esegue un throw
, la versione che si blocca in modo errato ritiene che non vi sia alcuna corrispondenza corrispondente (anche se esiste) e chiama terminate
. Quando invoco il programma tramite il corridore, l'eccezione viene catturata correttamente.
La mia domanda è un'idea del perché l'exec extra cambi il comportamento del programma eseguito?
Non so: ma execvp modifica la directory di lavoro? Quali argomenti stai passando? –
@MartinYork - AFAIK, 'execvp' non cambia mai la directory di lavoro (che richiede una chiamata a' chdir' e il corridore non lo fa). Gli argomenti specifici sono irrilevanti; il comportamento descritto è indipendente dagli argomenti specifici passati al programma. –
Fa la stessa cosa se usi 'execv()' invece di 'execvp()'? – caf