morfizm (morfizm) wrote,
morfizm
morfizm

Category:

Как восстановить случайно потерянный текст набираемого комментария

У вас бывало, что вы случайно нажали "Back", а по нажатию "Forward" набранный текст исчез из формы? А, может, вы случайно нажали "Refresh" на страничке. Во многих подобных случаях набранный текст всё ещё можно восстановить из памяти. Для этого нужно действовать быстро, чтобы минимизировать шанс срабатывания всевозможных "сборщиков мусора".

Моя инструкция относится только к Windows. Для Mac'ов нужен другой отладчик. dennyrolling рекоммендует gdb. У меня нет возможности его протестировать, но он, наверняка, способен выполнять те же функции, просто они будут как-то по-другому называться.

1. Установите отладчик WinDbg (AKA cdb) со странички Debugging Tools for Windows (вот прямой линк на MSI с 32-битной версией отладчика: Install 32-bit version 6.11.1.404 [16.9 MB]).

2. Выберите "Custom". Выберите Location: C:\Debuggers. Нажмите: Next, Install. Серьёзные парни никогда не ставят отладчик в Program Files, потому что его там фиг найдёшь.

3. Запустите C:\Debuggers\windbg.exe. Если какой-то из шагов ниже не будет работать, значит, вам нужны права администратора (на Vista нужно в меню Start набрать текст C:\Debuggers\windbg, но не нажимать Enter, а кликнуть правой клавишей на появившуюся иконку WinDbg.exe и выбрать "Run as Administrator").

4. Меню File/Attach to a Process (F6). Выберите "Sort by Executable" (Alt-E). Теперь вам нужно выбрать из списка имя процесса и его PID (Process ID). Чтобы узнать имя процесса и PID:

4.1. Запустите Task Manager (Ctrl+Shift+Esc).
4.2. В меню View/Select Columns поставьте галочку, если ещё не стоит, рядом с PID (Process Identifier) - она в самом верху списка.
4.3. Выберите закладку "Applications".
4.4. Выберите из списка приложение с окошком вашего обозревателя.
4.5. Кликните правой клавишей мыши на нём и выберите "Go to Process". Откроется закладка, Processes, и выделенная строка будет искомым процессом. Вам необходимо посмотреть имя в колонке "Image Name" и число в колонке "PID". Например, это iexplore.exe, 219840. Примечание: если вы используете tab'ы, то каждый tab может исполняться в отдельном процессе, поэтому вам, возможно, придётся повторить все нижеописанные действия для каждого процесса с таким же именем.

5. Нахождение строки. Вам нужно помнить какой-то открывок из текста, причём помнить его добуквенно, с учётом регистра, знаков препинания и пробелов. Выделенный текст надо ввести в командное окно:

0:016> s -u 0 L?100000000 "буду искать этот текст"
08d7f352  0431 0443 0434 0443 0020 0438 0441 043a  1.C.4.C. .8.A.:.
08db8b72  0431 0443 0434 0443 0020 0438 0441 043a  1.C.4.C. .8.A.:.
Текст нашёлся, причём в двух местах.

Формат команды s: -u означает искать unicode (-a для ascii), 0 - начальный адрес поиска, и 100000000 - количество байт, в которых искать (в данном случае - все 2GB 32-битного адресного пространства), ? означает игнорировать недопустимые диапазоны.

6. Теперь, когда отрывок найден, нужно извлечь весь текст. Для этого нужно найти место, где он начинается. Команда du показывает содержимое памяти в виде unicode-ной строки (da - для ascii строк). Пробуем по очереди адреса, найденные командой s. В нашем примере это 08d7f352 и 08db8b72, начнём с 08d7f352:

0:017> du 08d7f352 L100
08d7f352  "буду искать этот текст в debugge"
08d7f392  "r'е. Это очень весело и интересн"
08d7f3d2  "о.."
Пробуем уменьшить адрес:

0:017> du 08d7f252 L100
08d7f252  "MXm72MpvNWe-c416679896692667042b"
08d7f292  "abbf1d2f03d6"
Попали на какую-то другую строку. Значит, начало искомой строки находится между этими двумя адресами. Методом половинного деления подбираем адреса дальше, пока не находим настоящее начало:

0:017> du 08d7f306 L100
08d7f306  "Это мой методический пример. Сей"
08d7f346  "час я буду искать этот текст в d"
08d7f386  "ebugger'е. Это очень весело и ин"
08d7f3c6  "тересно.."
Если комментарий был длиннее 256 символов, то L100 нужно заменить на большее число, скажем, на L1000000, чтобы показать весь текст.

Не забывайте, что адреса указываются в шестнадцатеричной системе счисления (цифры: 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F). Например, серединка между 0 и 10 это 8, а между 8 и 10 - C. Также не забывайте, что для отображения unicode-ного текста нужно использовать чётные адреса.

Для английский текстов можно использовать упрощённый метод:

db 08d7f352 L-100

где 08d7f352 - адрес найденного фрагмента из середины, а -100 означает показать предыдущие 256 символов (100 в шестнадцатеричной системе). Если текст всё ещё не виден полностью, можно двигаться дальше (-200, -300, ...). Команда db, в отличие от du, не будет прекращать отображение на концах других строк, поэтому текст будет виден, даже если перескочить через начало. Но для русского текста это будет слегка awkward, т.к. он unicode и db будет его отображать неправильно.

Завершающие шаги: получив текст, я обычно копирую его в Far, вырезаю вертикальный блок, а потом много раз нажимаю (End, Del), чтобы склеить все эти кусочки в одну большую строку. Вот и всё. Результирующий текст, возможно, придётся ещё немного доработать напильником (например, символы перехода на новую строку в дебаггере отображаются точкой). Завершить сессию отладки следует командой:

qd

После этого приложение обозревателя продолжит выполнение.
Tags: 1
Subscribe
  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 10 comments