мерзавец svn переоснова: Неполные данные: источник Delta неожиданно заканчивается

Я не уверен, ищете ли вы (1) виртуальный адрес сопоставленного файла сборки или (2) виртуальный адрес, на котором код JITed помещается после загрузки сборки.

Далее я рассмотрю простой случай, когда хост-процесс загружает несколько сборок. Код можно найти здесь . Давайте сосредоточимся на том, что происходит, когда загружается x64_Assembly.dll .

Если мы ищем (1) определенный выше (виртуальный адрес сопоставленного файла в адресном пространстве процесса), то это означает выделенную ниже строку, показанную в выходных данных VMMap. Это где ОС загружает файл, содержащий сборку. Я не знаю, как вы могли бы получить это программно из своего собственного приложения.

enter image description here

Для (2), это виртуальный адрес, где находится JIT-код сборки, вы можете увидеть соответствующий адрес, если вы войдите в свой код с помощью отладчика:

enter image description here

Когда указывает этот поток , сборка JITed помещается в куча, которую вы можете легко проверить с помощью VMMap снова. В моем случае адрес, показанный в отладчике, можно увидеть в блоке кучи с VMMap:

enter image description here

Так какой адрес вы на самом деле нацеливание?

Позднее обновление : Вы можете использовать CLR MD для получения очень интересных данных. Взгляните на простой код, приведенный ниже (взят из «Написание высокопроизводительного кода .NET» Бена Уотсона), который получает (1) и , возможно, (2). Вы можете видеть, что адрес образа загруженной сборки в VMMap совпадает со значением module.ImageBase, поэтому вы обязательно получите (1). Для (2), однако, значение module.Address НЕ совпадает с переменной m_assembly, замеченной в отладчике в моем исходном ответе - поэтому один из них показывает что-то еще. Однако, если вы подумаете об этом, не весь код JITed одновременно - вместо этого CLR будет JIT компилировать методы так, как (и если) они вызываются. Поэтому я считаю, что виртуальные адреса, содержащиеся в 2 переменных, указывают на некоторую общую структуру, представляющую сборку.

enter image description here

Поскольку вы упомянули, что у вас есть доступ для проверки содержимого памяти, вы можете довольно быстро выяснить, какая из двух переменных представляет интерес ( 2). [+1135] 1136 Как вы могли это сделать на практике? Я имею в виду создание проекта CLR MD, который просто выводит информацию, которую вы ищете ((1) и (2), в простой файл)), а затем запускает этот EXE-файл вашим основным кодом, чтобы он анализировал ваш процесс и сборка он загружает и записывает данные. Когда процесс CLR MD завершается, ваш реальный код может получить информацию, записанную в файле, и работать с теми виртуальными адресами, которые он получил. В моем примере выше PID был просто жестко закодирован (я использовал Process Explorer, чтобы увидеть назначенный PID), но вы, вероятно, могли бы передать его в качестве аргумента в свой проект CLR MD.

Вы можете использовать опцию Управление пакетами NuGet для решения в Visual Studio, чтобы установить CLR MD и настроить его для своего конкретного проекта, а затем просто добавить using Microsoft.Diagnostics.Runtime.

2 вещи, которые нужно иметь в виду:

  • «битность» используемого вами кода CLR MD должна соответствовать анализируемому вами процессу (например, не создавать его). для x86 и другой для x64; все подробности о сборках и загрузке между битами приведены в статье, на которую я ранее ссылался )
  • , которую вы должны будете использовать AttachFlag.Passive в метод AttachToProcess, иначе ваш исходный код будет приостановлен на неопределенный срок. Я также проверил эту опцию после того, как сделал снимок экрана выше и успешно получил значения module.ImageBase и module.Address, плюс исходный код продолжал работать просто отлично.

13
задан Pistos 17 October 2008 в 03:47
поделиться

1 ответ

От личного опыта мерзавец-svn всегда генерирует те же самые фиксации при клонировании, или выбирая от репозитория SVN с теми же параметрами (попробуйте его: создайте фиктивный репозиторий, клонируйте его с мерзавцем-svn, сделайте еще некоторые фиксации, клонируйте его снова и выберите на первой копии; получающиеся фиксации должны иметь тот же самый хеш).

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

5
ответ дан 1 December 2019 в 21:39
поделиться