Если вы скомпилировали оригинальный исполняемый файл, например, с помощью g++ -O2 ...
, вы не можете (как вы, вероятно, обнаружили) использовать новый исполняемый файл, построенный с g++ -g ...
, для отладки core
- GDB нужны символы, чтобы соответствовать, и они не будут (из-за разницы в уровнях оптимизации) .
То, что вы можете сделать, - это создать новый исполняемый файл с той же оптимизацией, что и исходный, но также с символами отладки: g++ -O2 -g ...
.
После того, как вы создали новый исполняемый файл, запустите nm old.a.out > old.nm
, nm new.a.out > new.nm
и сравните результаты. Они должны быть одинаковыми или очень и очень близкими.
Если это так, вы сможете отладить core
, созданный old.a.out, с помощью new.a.out.
В будущем вы всегда должны создавать свой исполняемый файл с отладочными символами, затем сохранять полную копию, но отправлять копию без отладочной информации:
cp a.out a.out.debug
strip --strip-debug a.out
# a.out is now good to send to customers
# keep a.out.debug for future debugging