Отладка самого себя

Тема в разделе "WASM.WIN32", создана пользователем Pavia, 6 ноя 2011.

  1. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    OS: Ubuntu 10.4
    Wine:wine-1.2.2
    Компилятор: Delphi 7
    ЦП: 2-х ядерный

    Такой вопрос хочу написать приложение которое будет отлаживать самого себя.
    При этом приложение много поточное потоки должны сидеть на разных ядрах, возможно кочевать с ядра на ядро.
    Теперь вопрос такое можно сделать? Что будет при срабатывание события отладки процесс остановится полностью или только один поток? И как остановить другие потоки кроме того который отладкой занимается?
    Собственно такое реально? Или надо делать второе приложение и его использовать как сервер отладки?
     
  2. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    почему не реально? первое простейшее и работающее на всех платформах. но медленно. вместо стартовой функи пишем другую из которой и будем вызывать стартовую.

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

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

    это все, конечно, если надо сложно перебирать. например, где утекает или перетирается память (исключение покажет момент поломки, но не момент ошибки)