Когда мы получаем ошибку времени выполнения в быстром проекте, почему XCode отправляет нас в вывод Thread на языке ассемблера? В чем смысл ? - PullRequest
0 голосов
/ 03 сентября 2018

Как вы знаете, когда что-то не так, когда мы запускаем проект Swift в Xcode, мы обратимся к разделу потока отладочного навигатора и столкнемся с некоторым кодом сборки, подобным этому:

enter image description here

enter image description here

Мне интересно, есть ли какая-либо ссылка, учебное пособие или инструменты для понимания этих кодов, должна быть причина, по которой мы обращаемся к этому коду

позвольте мне очистить; Я знаю, как исправить ошибки, но это мучает меня, когда я не понимаю что-то подобное. Я хочу знать, что это за коды и как мы можем их использовать или хотя бы понять их.

Спасибо :)

1 Ответ

0 голосов
/ 03 сентября 2018

Оригинальный вопрос: что это за язык? Это синтаксический язык AT & T для x86-64. https://stackoverflow.com/tags/x86/info для руководств от Intel и других ресурсов и https://stackoverflow.com/tags/att/info для того, как синтаксис AT & T отличается от синтаксиса Intel, используемого в большинстве руководств. (Я думаю, что вики-тег x86 имеет несколько учебных пособий по синтаксису AT & T.) Большинство дизассемблеров AT & T также имеют режим intel-syntax, поэтому вы можете использовать его, если хотите, чтобы asm соответствовал руководствам Intel.


Какой смысл?

Дело в том, что вы можете отлаживать свою программу, если знаете asm. Или вы можете показать asm тому, кто его понимает, или включить его в отчет об ошибке.

Вы компилировали без отладочных символов? Или произошел сбой в коде библиотеки без символов? Отладчики могут показывать вам asm, если не могут показать исходный код или если вы спрашиваете asm.

Если у вас есть символы отладки для вашего собственного кода, вы можете по крайней мере вернуться к родительским функциям, для которых у вас есть источник. (Если только стек не поврежден.)


Ошибка вашей программы в этой инструкции выделена розовым цветом? Это немного странно, так как он загружается из статических данных (относительная загрузка RIP означает, что адрес является постоянной времени соединения).

Возможно, вы munmap или mprotect на этой странице данных или текстового сегмента вашей программы, так что загрузка может дать сбой? Обычно ошибки возникают только тогда, когда в режиме адресации используется указатель.

(Тем не менее, call *0x1234(%rip) прямо перед вызовом через указатель функции. Указатель функции сохраняется в памяти, но выборка кода после выполнения call приведет к сбою, если он указывает на неотображенный или не -исполняемая страница). Но ваше первое изображение показывает, что вы получили SIGABRT, а не SIGSEGV, так что это больше похоже на то, что программа нарочно прервана после неудачного подтверждения.

Я считаю, что большинство быстрых кодеров не знают asm

Нет ничего более полезного для отладчика без символов отладки и исходных файлов.

Также имейте в виду, что большинство авторов отладчиков знают asm, поэтому для них это очевидно полезная функция / поведение. Они знают, что многие люди не смогут извлечь из этого пользу, но некоторые из них получат.

Asm - это то, что действительно работает на машине. Без asm вы не смогли бы найти ошибки компилятора с неправильным кодом и т. Д. И т. Д. Что касается программных ошибок, то нет более низкого уровня, чем asm, так что это не произвольный выбор какого-то более низкого уровня, на котором стоит остановиться.

(Если в вашем дизассемблере или отладчике также есть ошибка, в этом случае вам необходимо проверить шестнадцатеричный машинный код.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...