Способы отладки

Материал из Русский WINE
Перейти к: навигация, поиск

Как получить адрес, по которому произойдёт переход после завершения выполнения функции

void **ptr;
void *ret_addr;
__asm__( "movl %%ebp,%0" : "=r" (ptr) );
ret_addr = *(++ptr);

Вывод backtrace и адресов, по которым загружены модули

char buf[256];
FILE *f;
sprintf(buf, "winedbg %d 1>&2", GetCurrentProcessId());
f = popen(buf, "w");
fprintf(f, "bt\n");
fprintf(f, "info share\n");
pclose(f);

Отключение вывода отладочных сообщений

unsigned char _flags = __wine_dbg_get_channel_flags(&__wine_dbch_istorage);
/* Отключаем вывод отладочных сообщений для канала istorage */
__wine_dbg_set_channel_flags(&__wine_dbch_istorage, 0, _flags);
..............
/* Включаем вывод отладочных сообщений для канала istorage */
__wine_dbg_set_channel_flags(&__wine_dbch_istorage, _flags, 0);

Отладка закрытой части

Небольшие заметки по отладке в закрытой части

Чтобы подцепить ту закрытую часть, которую нужно, надо установить

export LD_LIBRARY_PATH=/home/.../Projects/wine-etersoft/lib/.libs

Удобнее всего просто запускать wine через скрипт lib/runwith.sh в закрытой части, например:

$ /home/.../Projects/WINE/wine-etersoft/lib/runwith.sh wine notepad
  • Для сборки закрытой части нужно autogen.sh, затем configure, затем make.
Если что-то не собралось (по причине отсутствия некоторых макросов) можно попробовать повторить всю операцию заново.
  • Важно
    . Отладочный вывод нельзя производить в stdout, а обязательно в stderr, например:
fprintf(stderr, "%s: WINE_UNIQUE\n", name);
Вывод в stdout не будет отображаться в консоли.