Бывает, что дебажить код в dll-ке утомительно, но при этом хочется знать с какими параметрами вызываются функции. К тому же часто в код библиотек добавляются противоотладочные средства, однако предлагаемый подход работает нормально даже там.
Навеяно статьей, которая и легла в основу проекта:
http://www.codeproject.com/KB/DLL/CreateYourProxyDLLs.aspx
Автор статьи оставил логирование параметров в качестве домашнего задания, а я предлагаю классу ознакомиться с моим вариантом:
здесь
Что делает проект: проект делает библиотеку, которая по экспорту является точной копией исходной либы.
Затем после запуска приложения все вызовы к исходной либе проходят через наш прокси. Код, который генерируется для прокси логирует стек глубиной 10(ну мне просто не надо больше обычно) и основные регистры. Причем логируются значения стека и регистров как до вызова функции, так и после. + если значение в регистре или на стеке указатель(ну сами понимаете, проверяю я это попыткой считать по указателю что-либо) то логируется как значение, так и то, что по указателю было(10000 байт по дефолту).
Когда приложение выгружается прокси либа создает лог файл где вы можите найти какие функции какой либы вызывались и с какими параметрами.
Проект ужасно сырой и в нем если куча недочетов о которых я и сам знаю. Но поскольку мне самому кроме этого ничего было не нужно я и остановил развитие. Но не пужайтесь — я использовал в довольно сложных приложениях, поэтому думаю подойдет и вам.
Работает так:
1)брем либу(я взяд для теста CLI svn сборку slik и ее либу для обработки CLI) SlikSvn-svn_client-1.dll
2)открываем make_dump.bat и правим в этом файле путь к бинаризам вижуала. Я юзаю 2003 для этого. Можите любой другой студией собирать. У меня и 2008 строит. Просто батники под себя подстройте.
3) на выходе получится SlikSvn-svn_client-1.dll.txt . это файл с описанием функций которые экспортируе ваша либа. Этот файл то проект и парсирует
4) далее открываем make_proxy_dll.bat
proxydll_creator.exe надо построить из приаттаченного проета.
1-й параметр это имя той либы поторую мы будем эмулировать
2-й имя файла экспорта с предыдущего шага.
3-й оставьте __stdcall. Фиг его знает зачем его ввел автор да и я его не использую. забыл удалить.
4-й имя файла в который вы переименуете исходную длл-ку
5-й имя исходника на с++ который сгенерит тул
6-й имя деф файла для компилярора о котором ниже
на выходе после этого шага имеем файлы с названиями из 4-го и 5-го параметров.
5) открываем make_dll.bat, фиксим и запускаем.
на выходе тут у нас SlikSvn-svn_client-1.dll. Ее мы копируем в D:\Program Files\SlikSvn\bin\ и выполняем svn info например. после этого в текущей директории находим файл SlikSvn-svn_client-1.cpp и смотрим с каким параметрами что вызывалось.