Был интересный баг - в процессе выполнения скрипта сборки выполнение тестов приводило к жесткому падению процесса. Там был какой-то явный баг с памятью. Но самое интересное дальше. Makefile после падения процесса, выполняющего тесты, продолжал работать, что означало завершение упавшего процесса с нулевым кодом, а должно было быть что-то явно ненулевое.
С багом мы разобрались (включая проблему в Makefile), но возник у меня общий вопрос: с каким именно кодом завершается процесс, если он упал, не успев выполнить exit().
В UNIXах есть специальные макросы, которыми можно проинспектировать код возврата wait(). Но, все UNIXы разные, и к тому же есть еще Windows.
В итоге я написал небольшую самопадающую программу:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char* argv[]) {
char cmd[80];
int r;
sprintf(cmd, "%s ?", argv[0]);
if (argc > 1) {
if (argv[1][strlen(argv[1]) - 1] == '1')
*(char *)0 = 0;
exit(0x77);
}
printf("Normal: %08X\n", system(cmd));
cmd[strlen(cmd) - 1] = '1';
printf("Crash : %08X\n", system(cmd));
return 0;
}
И запустил на некоторых характерных машинах.
Windows 7, Visual Studio 2010, "cl crash.c && crash":
Normal: 00000077 Crash : C0000005
Linux x86_64 ("cс -o crash crash.c && ./crash"):
Normal: 00007700 Crash : 0000000B
Сигнал 0x0B (13) - это, кстати, SIGSEGV, segmentation violation, что, собственно, и произошло.
Solaris SPARC 5.10:
Normal: 00007700 Segmentation Fault - core dumped Crash : 00008B00
HP-UX Itanium 2:
Normal: 00007700 sh: 25112 Memory fault(coredump) Crash : 00008B00
AIX 5.2:
Normal: 00007700 Crash : FFFFFFFF
Тут, видимо, до system() код возврата не дошел совсем.
Вывод: все крайне зависит (как всегда) от операционной системы.
Комментариев нет:
Отправить комментарий