Можно ли заставить какую-либо программу в Linux печатать отслеживание стека если это segfaults?

Я не рассмотрел бы использование Vista с SSD. Vista не была оптимизирована для использования с SSD (ни был XP), и имеет некоторые серьезные узкие места производительности. Вы были бы более обеспечены с SSD в Windows 7, который показал, чтобы иметь значительный SSD perofrmance улучшения.

SSD может быть восприимчив к статическому electical волнению. Пока Вы не заботитесь, проигрываете ли Вы, все (скажите, что Вы имеете хорошие резервные копии и можете восстановить из изображения), затем, RAID0 прекрасен и должен дать хорошее повышение, хотя я никогда не видел сравнительных тестов для подтверждения этого с SSD.

20
задан 2 September 2009 в 22:09
6 ответов

Мог бы быть лучший путь, но это отчасти автоматизирует его.

Вставьте следующее ~/backtrace:

backtrace
quit

Поместите это в названный сценарий seg_wrapper.sh в каталоге в Вашем пути:

#!/bin/bash
ulimit -c unlimited
"$@"
if [[ $? -eq 139 ]]; then
    gdb -q $1 core -x ~/backtrace
fi

ulimit команда делает его так, ядро выводится. "$@" аргументы, данные сценарию, таким образом, это была бы Ваша программа и ее аргументы. $? содержит статус выхода, 139, кажется, статус выхода по умолчанию для моей машины для segfault.

Для gdb, -q тихие средства (никакое вводное сообщение), и -x говорит gdb выполнить команды в файле, данном ему.

Использование

Таким образом для использования его Вы были бы просто:

seg_wrapper.sh ./mycommand and its arguments 

Обновление

Вы могли также записать обработчик сигналов, который делает это, видит эту ссылку.

25
ответ дан 2 December 2019 в 20:07

Вам нужен общий друг GDB

gdb <program> [core file]

После того как Вы загрузили свой corefile, команда 'след' (может быть сокращен до купленного), даст Вам текущий стек вызовов. Если Вы запускаете свою программу из gdb, можно установить произвольные точки останова и исследовать содержание памяти и т.д.

6
ответ дан 2 December 2019 в 20:07
  • 1
    Существует ли способ получить его только для печати следа и выхода? –  Neil 2 September 2009 в 22:31

Ubuntu (как проект) использует Apport, чтобы сделать это. Можно посмотреть, как они сделали это.

https://wiki.ubuntu.com/Apport

3
ответ дан 2 December 2019 в 20:07

Извини, что зашел сюда 2 года спустя ... наткнулся на что-то еще. Добавляем это для полноты.

1) Хотя я думаю, что принятый ответ хорош, он требует gdb. В методе, который мне знаком, используется libSegFault.so.

Если вы запустите приложение с

LD_PRELOAD = ... path-to ... / libSegFault.so myapp

, вы получите отчет с обратной трассировкой, загруженные библиотеки и т. д.

2) Также доступен сценарий оболочки catchsegv , который пытается использовать addr2line для преобразования адресов в имя файла + номер строки.

Они намного легче решения, чем файлы ядра или gdb (например, хорошо для встроенных систем)

19
ответ дан 2 December 2019 в 20:07

Вот слегка измененный вариант сценария от Кайла Брандта. Это улучшено следующими способами:

  • не требует ручного взаимодействия, если трассировка стека длинная
  • некоторые резервные дампы сохраняются с именем pattern core., Соблюдайте этот параметр
  • не требует явного командного файла, летающего вокруг для gdb (он создаст временный)
  • ожидание фоновых заданий

Скрипт:

#!/bin/bash
gdbcommandfile=$(tempfile)
usepid=$(cat /proc/sys/kernel/core_uses_pid)
printf "set pagination off\nbacktrace\nquit\n" > $gdbcommandfile
ulimit -c unlimited
"$@"&
pid=$!
wait $!
if [[ $? -eq 139 ]]; then
    if [[ $usepid == 1 ]]; then 
        gdb -q $1 core.$pid -x $gdbcommandfile
    else
        gdb -q $1 core -x $gdbcommandfile
    fi
fi
rm $gdbcommandfile
2
ответ дан 2 December 2019 в 20:07

catchsegv

Упоминалось в другом ответе (но ни в коей мере не было уделено внимания). Это удобный инструмент в комплекте с проектом glibc. Он обеспечит обратную связь (и другую полезную отладочную информацию) только в том случае, если программа действительно работает раздельно.

Хорошая запись существует здесь.

Вы можете включить ее в свои собственные скрипты, как считаете нужным.

.
5
ответ дан 2 December 2019 в 20:07

Теги

Похожие вопросы