Анализ основного дампа в розничной сборке часто требует сопоставления 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
Примечание Судя по ответам,чтение исходного кода сборки и интуитивное определение шаблона на основе символов (, таких как вызовы функций, переходы, оператор возврата ), — это то, что я обычно делаю. Я не отрицаю, что это не работает, но когда функция очень вовлечена, чтение страниц листинга сборки вызывает боль, и часто вы получаете листинг, который редко совпадает либо из-за функций, попадающих в -, выровненных, либо из-за того, что оптимизатор имеет просто подкинул код как ему вздумается. У меня такое ощущение, что, видя, насколько эффективно Valgrind
обрабатывает оптимизированные двоичные файлы и как в Windows WinDBG может обрабатывать оптимизированные двоичные файлы, я что-то упускаю. Поэтому я решил начать с вывода компилятора и использовать его для корреляции. Если мой компилятор несет ответственность за искажение двоичного файла, лучше всего будет сказать, как соотнести его с исходным кодом, но, к сожалению, это было наименее полезным, а .loc
действительно вводит в заблуждение. К сожалению, мне часто приходится читать невоспроизводимые дампы на разных платформах, и меньше всего времени я трачу на отладку дампов Windows Mini -через WinDBG и значительное время на отладку Linux Coredumps. Хотя, может быть, я что-то делаю не так, поэтому я придумал этот вопрос.