разборки выглядит следующим образом:Почему я не могу войти в команду вызова во время отладки/разборки?
methShort(ref x, ref y);
000007FF00163F67 lea r8,[rsp+34h]
000007FF00163F6C lea rdx,[rsp+30h]
000007FF00163F71 mov rcx,qword ptr [rsp+20h]
000007FF00163F76 mov rcx,qword ptr [rcx+8]
000007FF00163F7A mov rax,qword ptr [rsp+20h]
000007FF00163F7F call qword ptr [rax+18h]
Метод "methShort" динамически создаются в .NET с использованием Reflection.Emit. В качестве значений «byRef» требуется два параметра Int32. Это отлаживается как сборка «release-режим».
Я могу выполнить сборку вплоть до инструкции «вызов». Содержимое памяти, на которое указывают R8 и RDX (параметры), выглядит отлично. Я не знаю, какая магия позволила JIT использовать регистры для вызова вместо стека, но это не относится к делу.
Когда я пытаюсь выполнить «шаг за шагом» в команде вызова, вместо этого отладчик «перешагивает» его. Подпрограмма действительно называется - метод выполнил свою функцию правильно. Но я не могу разбираться и не вступать в метод.
В точке непосредственно перед вызовом RAX содержит значение 00000000025C67A8h. Когда к нему добавляется 18h, адрес для косвенности становится 00000000025C67C0h. QWORD по этому адресу: 000000001b64dc48h.
Если я попытаюсь разобрать этот адрес (000000001b64dc48h), отладчик вернется с «Указанный адрес не может быть отображен. В указанном месте отсутствует код».
Как попытка Hail Mary, я попытался разобрать код в RAX без косвенности, но, как я ожидал, это тоже не удалось.
Может ли кто-нибудь сказать мне, как добраться до любого кода по адресу, или если что-то похожее на LEA должно выполняться по адресу (RAX + 18h), прежде чем разбирать код там?
https://msdn.microsoft.com/en-us/library/ms235286.aspx в x64 первые два параметра вызова метода находятся в RCX и RDX. – xanatos
VS отказывается показать вам некоторые части среды выполнения. Это должен быть вызов помощника во время выполнения. Я никогда не понимал, почему они абсолютно уверены, что отладчик не может даже разобрать время выполнения. – usr