Анализ дампа ядра в розничной сборке часто требует сопоставления objdump
любого конкретного модуля и источника. Обычно сопоставление дампа сборки с исходным кодом становится проблемой, если функция достаточно вовлечена. Сегодня я попытался создать assembly listing
одного конкретного модуля (с опцией компиляции -S
), ожидая, что увижу чередующийся источник со сборкой или какую-то корреляцию. К сожалению, список не был достаточно дружелюбным, чтобы сопоставить, поэтому мне было интересно
- Учитывая дамп ядра, из которого я могу определить место падения
objdump
списка сборки неисправного модуля, перекомпилировав- модуль с опцией
-S
.
Можно ли вести индивидуальную переписку с источником?
В качестве примера я вижу листинг сборки как
.LBE7923:
.loc 2 4863 0
movq %rdi, %r14
movl %esi, %r12d
movl 696(%rsp), %r15d
movq 704(%rsp), %rbp
.LBB7924:
.loc 2 4880 0
testq %rdx, %rdx
je .L2680
.LVL2123:
testl %ecx, %ecx
jle .L2680
movslq %ecx,%rax
.loc 2 4882 0
testl %r15d, %r15d
.loc 2 4880 0
leaq (%rax,%rax,4), %rax
leaq -40(%rdx,%rax,8), %rdx
movq %rdx, 64(%rsp)
но не мог понять, как интерпретировать метки типа .LVL2123
и директивы типа .loc 2 4863 0
Примечание Как показано в ответах, чтение исходного кода сборки и интуитивное определение шаблона на основе символов (таких как вызовы функций, ветки, оператор return) — это то, что я обычно делаю. Я не отрицаю, что это не работает, но когда функция довольно вовлечена, чтение страниц листинга сборки вызывает боль, и часто вы получаете листинг, который редко совпадает либо из-за встроенных функций, либо из-за того, что оптимизатор просто выбросил код, как он хотел. У меня такое ощущение, что, видя, насколько эффективно Valgrind
обрабатывает оптимизированные двоичные файлы и как в Windows WinDBG может обрабатывать оптимизированные двоичные файлы, я что-то упускаю. Поэтому я решил начать с вывода компилятора и использовать его для корреляции. Если мой компилятор несет ответственность за искажение двоичного файла, лучше всего будет сказать, как соотнести его с исходным кодом, но, к сожалению, это было наименее полезным, а .loc
действительно вводит в заблуждение. К сожалению, мне часто приходится читать невоспроизводимые дампы на разных платформах, и меньше всего времени я трачу на отладку мини-дампов Windows через WinDBG и значительное время на отладку Linux Coredumps. Хотя, может быть, я что-то делаю не так, поэтому я придумал этот вопрос.
addr2line
перевести в исходные локации. Для этого, конечно, требуется исполняемый файл с символами отладки (он должен работать, даже если ваша распределенная версия была удалена, просто сравните с неразделенной версией) - person edA-qa mort-ora-y   schedule 02.05.2012