Как использовать GDB для анализа приложений, таких как текстовый процессор - PullRequest
1 голос
/ 23 декабря 2011

Я новичок в том, что касается разработки с открытым исходным кодом.Я пробовал свои силы в нескольких проектах, но всегда заканчивал тем, что разочаровывался из-за большой кодовой базы.

Одна конкретная проблема, с которой я всегда сталкивался, - это неспособность определить, какая часть больших кодовых дескрипторов обрабатываетконкретная работа.Скажем, если я хочу знать, какая часть кода выполняет рендеринг и разметку текста в текстовом процессоре.

Совет, который часто дают люди, состоит в том, чтобы пройти по программе, используя gdb.

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

ЭтоЭто было то, что я получил при выполнении gdb /usr/local/bin/abiword

(gdb) bt
0  0xffffe424 in __kernel_vsyscall ()
1  0xb63b472b in poll () from /lib/libc.so.6
2  0xb66256eb in g_poll () from /usr/lib/libglib-2.0.so.0
3  0xb6616db6 in ?? () from /usr/lib/libglib-2.0.so.0
4  0xb66174bb in g_main_loop_run () from /usr/lib/libglib-2.0.so.0
5  0xb6d6668d in gtk_main () from /usr/lib/libgtk-3.so.0
6  0xb7c04a4d in AP_UnixApp::main (szAppName=0x8048970 "abiword", argc=1, 
    argv=0xbffff704) at ap_UnixApp.cpp:1332
7  0x080488a3 in main (argc=1, argv=0xbffff704)
    at ../src/wp/main/gtk/UnixMain.cpp:30

Пожалуйста, предложите, как GDB может быть использован для этой цели.Извините, если мой вопрос звучит слишком глупо, но я действительно теряю слов для такой задачи, поэтому Google тоже не помогает.: |

1 Ответ

3 голосов
/ 23 декабря 2011

Люди часто советуют проходить через программу, используя gdb.

Это худший возможный совет при работе с такими сложными вещами, кактекстовый процессор (сокращенно WP).

Вместо этого вы должны запустить ldd в двоичном файле или посмотреть /proc/<pid>/maps для работающего WP и посмотреть, какие общие библиотеки он использует.

Тогда читайте об этих библиотеках.Один из них, вероятно, связан с визуализацией текста.Скорее всего, он также поставляется с набором примеров.

Создайте эту библиотеку, создайте примеры, измените их, чтобы сделать что-то еще.

Теперь вы готовы ответитьтакие вопросы, как «как этот WP использует эту библиотеку» путем установки точек останова GDB в точках входа библиотеки и изучения того, какие части WP вызывают их и с какими параметрами.

Повторите для других библиотек ив конечном итоге вы создадите картину того, как все складывается вместе.

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

В GDB сделайте следующее: catch syscall open.Теперь попробуйте открыть файл, и вы узнаете, какая именно часть WP отвечает за это.

РЕДАКТИРОВАТЬ:

"catch syscall open" ловит все "открытые"системные вызовы, которых много

Да.Но не должно быть столько open с после запуска WP.Так что сделайте catch после того, как у вас на экране WP, и непосредственно перед выполнением операции меню File->Open.

Есть ли способ указать имя файла вместе с catch syscall open?

Да, вы можете сделать catch условным.Детали условия зависят от ОС.Похоже, вы используете i686-linux с VDSO.Для этой комбинации следует выполнить следующее:

(gdb) catch syscall open
Catchpoint 1 (syscall 'open' [5])

(gdb) cond 1 ((char*)$ebx)[0] == '/' && ((char*)$ebx)[1] == 'h' \
           && ((char*)$ebx)[2] =='o' && ((char*)$ebx)[3] == 'm'

Вышеуказанное условие остановит точку перехвата только при открытии файлов с префиксом "/hom".

Вы можете добавить больше букв вочевидный путь.

Вы также можете попробовать это:

(gdb) cond 1 0 == strcmp($ebx, "/home/nav/Doc1.doc")

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

...