Я не рассмотрел бы использование Vista с SSD. Vista не была оптимизирована для использования с SSD (ни был XP), и имеет некоторые серьезные узкие места производительности. Вы были бы более обеспечены с SSD в Windows 7, который показал, чтобы иметь значительный SSD perofrmance улучшения.
SSD может быть восприимчив к статическому electical волнению. Пока Вы не заботитесь, проигрываете ли Вы, все (скажите, что Вы имеете хорошие резервные копии и можете восстановить из изображения), затем, RAID0 прекрасен и должен дать хорошее повышение, хотя я никогда не видел сравнительных тестов для подтверждения этого с SSD.
Мог бы быть лучший путь, но это отчасти автоматизирует его.
Вставьте следующее ~/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
Вы могли также записать обработчик сигналов, который делает это, видит эту ссылку.
Вам нужен общий друг GDB
gdb <program> [core file]
После того как Вы загрузили свой corefile, команда 'след' (может быть сокращен до купленного), даст Вам текущий стек вызовов. Если Вы запускаете свою программу из gdb, можно установить произвольные точки останова и исследовать содержание памяти и т.д.
Ubuntu (как проект) использует Apport, чтобы сделать это. Можно посмотреть, как они сделали это.
Извини, что зашел сюда 2 года спустя ... наткнулся на что-то еще. Добавляем это для полноты.
1) Хотя я думаю, что принятый ответ хорош, он требует gdb. В методе, который мне знаком, используется libSegFault.so.
Если вы запустите приложение с
LD_PRELOAD = ... path-to ... / libSegFault.so myapp
, вы получите отчет с обратной трассировкой, загруженные библиотеки и т. д.
2) Также доступен сценарий оболочки catchsegv
, который пытается использовать addr2line
для преобразования адресов в имя файла + номер строки.
Они намного легче решения, чем файлы ядра или 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
Упоминалось в другом ответе (но ни в коей мере не было уделено внимания). Это удобный инструмент в комплекте с проектом glibc. Он обеспечит обратную связь (и другую полезную отладочную информацию) только в том случае, если программа действительно работает раздельно.
Хорошая запись существует здесь.
Вы можете включить ее в свои собственные скрипты, как считаете нужным.
.