Я пытаюсь отследить очень странную аварию. Что в этом такого странного, так это обходной путь, который кто-то обнаружил и который я не могу объяснить.
Обходной путь - это небольшая программа, которую я буду называть «бегуном»:
#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;
}
Как видите, все, что делает эта программа, это использует execvp
для замены себя другой программой.
Программа аварийно завершает работу при прямом вызове из командной строки:
/path/to/prog args # this crashes
но отлично работает, когда он косвенно вызывается через мою прокладку бегуна:
/path/to/runner /path/to/prog args # works successfully
На всю жизнь я могу понять, как дополнительный exec может изменить поведение запущенной программы (как вы можете видеть, программа не меняет среду).
Немного предыстории аварии. Сам сбой происходит во время выполнения C++. В частности, когда программа выполняет throw
, сбойная версия ошибочно считает, что нет подходящего улова (хотя он есть), и вызывает terminate
. Когда я вызываю программу через бегун, исключение правильно перехватывается.
Мой вопрос: есть идеи, почему дополнительный exec меняет поведение исполняемой программы?
execvp
никогда не меняет рабочий каталог (для этого требуется вызовchdir
, а бегун этого не делает). Конкретные аргументы не имеют значения; описанное поведение не зависит от конкретных аргументов, переданных программе. - person R Samuel Klatchko   schedule 22.03.2010execv()
вместоexecvp()
? - person caf   schedule 23.03.2010strace
в программе, вызывающей сбой, чтобы попытаться определить причину сбоя? - person clstrfsck   schedule 23.03.2010execv
- person R Samuel Klatchko   schedule 23.03.2010strace
, так иltrace
и не вижу ничего, что могло бы объяснить разницу в поведении. - person R Samuel Klatchko   schedule 23.03.2010