Почему порождаемый код программы изменяется при отладке?

У меня есть программа на C ++, которую я использую, чтобы проверить, что другая программа не падает. Родительский код (назовем его parentProg) выглядит примерно так:

int run(const char * command)
{
...

int retCode = system(command);
printf("Code is %d\n",retCode);
if(retCode == 134) //128 + SIGABORT
{
// Record error conditions
...
}
}

Переменная command содержит тестируемую программу (назовем ее childProg). В предыдущем дистрибутиве Linux этот код работал должным образом. Если a.out потерпит крах или ударит по утверждению, он вернет 134, и код обработки ошибок будет выполнен. Однако после того, как я перешел на более новый дистрибутив Linux, это уже не так. Вместо этого я вижу код возврата 6, когда запускается как порожденная программа, используя GDB или nemiver. Странно, но возвращается к 134, если я запускаю дочернюю программу самостоятельно или использую DDD.

Для следующих тестов я изменил childProg, чтобы он был только следующим кодом:

#include <assert.h>

int main(int argc, char * argv[])
{
assert(0);
return 0;
}

childProg сам по себе

[user@localhost multi]$ ./childProg
childProg: temp.cpp:5: int main(int, char **): Assertion `0' failed.
Abort
[user@localhost multi]$ echo $?
134

parentProg, который порождает childProg

[user@localhost multi]$ ./parentProg 1 o
Running 1 times
childProg: temp.cpp:5: int main(int, char **): Assertion `0' failed.
Code is 6
Done 0
[user@localhost multi]$

С GDB

(gdb) run
Starting program: parentProg 1 o
Running 1 times
Detaching after fork from child process 3311.
childProg: temp.cpp:5: int main(int, char **): Assertion `0' failed.
Code is 6
Done 0
[Inferior 1 (process 3295) exited normally]
(gdb)

С DDD

(gdb) run 1 o
Starting program: parentProg 1 o
Running 1 times
Detaching after fork from child process 3336.
childProg: temp.cpp:5: int main(int, char **): Assertion `0' failed.
Code is 134
Done 0
[Inferior 1 (process 3319) exited normally]
(gdb)

Это работает как ожидалось

[me@localhost multi]$ /bin/sh -c ./childProg
childProg: temp.cpp:5: int main(int, char **): Assertion `0' failed.
Abort
[me@localhost multi]$ echo $?
134

Что здесь может происходить? Есть ли лучший способ проверить наличие сбоев / segfaults / утверждений, кроме проверки кода выхода?

4

Решение

<SYS / wait.h> Заголовочный файл содержит макросы для анализа кодов возврата.

Чтобы проверить причину выхода, вы можете сделать что-то вроде этого:

#include <stdio.h>
#include <sys/wait.h>

...

void run(const char *command)
{
int retcode = system(command);

if (WIFEXITED(retcode))
{
int status = WEXITSTATUS(retcode);
if (status)
{
printf("Exited normally with FAILURE status of %d!\n", status);
}
else
{
printf("Exited normally with SUCCESS(0) status!\n");
}
}
else if (WIFSIGNALED(retcode))
{
int signal = WTERMSIG(retcode);
printf("Abnormal termination - program crashed or was aborted with signal %d\n", signal);
}

}

Смотрите «man waitpid» для описания этих макросов.

6

Другие решения

(134 = 6 | __WCOREFLAG)

Увидеть man 2 wait

1

По вопросам рекламы [email protected]