LINUX.ORG.RU

Как заставить gcc сгенерировать core при segmentation fault?


0

0

Есть небольшая тестовая программка на C: http://pastie.org/1376141 (по сути, минимальный файл, на котором получается воспроизвести ошибку).

При его сборке со включённой оптимизацией, -fopenmp и -flto lto1 падает с ошибкой сегментации:

$ gcc-4.5 test.c -o test -O1 -fopenmp -flto -std=c99
lto1: internal compiler error: Ошибка сегментирования
Please submit a full bug report,
with preprocessed source if appropriate.
See <file:///usr/share/doc/gcc-4.5/README.Bugs> for instructions.
lto-wrapper: /usr/bin/gcc-4.5.real returned 1 exit status
collect2: lto-wrapper returned 1 exit status

Несмотря на ulimit -c unlimited, core упорно не генерируется.

Как выйти из положения?

★★★

> падает с ошибкой сегментации:

оно не падает, поэтому ulimit -c не поможет.

кто, по вашему, пишет «Please submit ...» ?

idle ★★★★★
()

>Как выйти из положения?

Сам бинарник gcc не занимается компиляцией, он всего лишь оболочка для компиляторов, ассемблеров, линкеров и проч.
Найди у себя исполняемые файлы «cc1/cc1plus»(для C/C++) и попробуй ими скомпилировать свой пример. Мана по ним нет, но если работал с gcc всё интуитивно понятно.

lto1

В твоём случае ещё видимо один хелпер. А что же с gcc-4.4, в котором lto нету?

gogi
()
Ответ на: комментарий от idle

Падает не сам gcc, а его дочерний процесс:

/usr/lib/gcc/x86_64-linux-gnu/4.5.1/lto1 -quiet -dumpbase test -dumpdir ./ -mtune=generic -march=x86-64 -auxbase-strip /tmp/ccDsbwDB.lto.o -Os -std=c99 -version -fopenmp @/tmp/ccpy5A0B -o test.s

sjinks ★★★
() автор топика
Ответ на: комментарий от gogi

Спасибо, решилось путём запуска

gcc-4.5 test.c -o test -O1 -fopenmp -flto -std=c99 -save-temps -v

и запуска

gdb /usr/lib/gcc/x86_64-linux-gnu/4.5.1/lto1

с параметрами, которые напечатал gcc

Хотя всё равно непонятно, почему core не сгененрировался автоматом.

sjinks ★★★
() автор топика
Ответ на: комментарий от sjinks

> Падает не сам gcc, а его дочерний процесс:

ну да, он же пишет

lto1: internal compiler error: Ошибка сегментирования

Хотя всё равно непонятно, почему core не сгененрировался автоматом.


наверное, просто SIGSEGV перехватывается?

collect2: lto-wrapper returned 1 exit status

если бы он убивался сигналом (любым), exit status был бы
другим. а так, похоже на exit(1). хотя, неизвестно, как
именно gcc инетпретирует результат wait(&status) для
печати.

idle ★★★★★
()
Ответ на: комментарий от idle

Да, так и есть. В gcc/toplev.c в general_init() устанавливаются обработчики фатальных сигналов.

Там же обработка опций -d<LETTER>, -dH заставляет gcc генерировать core dump'ы.

sjinks ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.