Как я могу заставить XCode / GDB сломаться в плагине Safari 5.1 NPAPI? - PullRequest
4 голосов
/ 02 сентября 2011

У меня есть подключаемый модуль NPAPI, работающий на OS X 10.6.8, который я хотел бы отладить.Когда я загружаю его с помощью FireFox 3.6.19, я могу установить для активного исполняемого файла значение FF, запустить FF, присоединить с помощью XCode, и точка останова сработает в ожидаемое время.

При использовании Safari 5.1 я вижу, чтоплагин не работает, поэтому я создал и активировал исполняемый файл клиента для /System/Library/PrivateFrameworks/WebKit2.framework/PluginProcess.app.Затем я запускаю Safari, перехожу на страницу с плагином, присоединяюсь к процессу плагина и затем использую пользовательский интерфейс, такой, что точка останова должна срабатывать, но это не так.Я могу сказать по интерфейсу, что плагин определенно загружен.Если приостановить процесс, я вижу:

(gdb) i b
Num Type           Disp Enb Address    What
1   breakpoint     keep y   <PENDING>  "ADP_NPAPI_Interface.m":34
2   breakpoint     keep y   <PENDING>  "ADP_NPAPI_Interface.m":34
3   breakpoint     keep y   <PENDING>  "ADP_NPAPI_Interface.m":34
4   breakpoint     keep y   <PENDING>  "plugin.cpp":244
5   breakpoint     keep y   <PENDING>  "plugin.cpp":358
6   breakpoint     keep y   <PENDING>  objc_exception_throw
(gdb) show directories
Source directories searched: $cdir:$cwd
(gdb) info sources
No symbol table is loaded.  Use the "file" command.
(gdb) file sources
sources: No such file or directory
(gdb) info file
No registers.
No registers.
(gdb) show paths
Executable and object file path: /Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin

DEBUG_INFORMATION_FORMAT = dwarf-with-dsym.Насколько я понимаю, символы будут в плагине, поэтому я считаю, что GDB не может найти мои исходные файлы.

Заранее спасибо за помощь, Дейв

Ответы [ 3 ]

3 голосов
/ 02 сентября 2011

Один метод, который я иногда использовал с FireBreath плагинами, таков:

#if WAIT_FOR_DEBUGGER
static bool beingDebugged() {
    int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_PID, getpid()}; size_t mib_size = 4;
    struct kinfo_proc kp; size_t kp_size = sizeof(kp);
    int result = sysctl(mib, mib_size, &kp, &kp_size, NULL, 0);
    return (0 == result) ? (P_TRACED & kp.kp_proc.p_flag) : false;
}
#endif

Затем в одной из точек входа (например, NP_Initialize) вы делаете:

#if WAIT_FOR_DEBUGGER
    #warning "WILL BLOCK ON P_TRACED"
    while (!beingDebugged())
        sleep(1);
#endif

Мой друг придумал это, и это, кажется, работает довольно хорошо.Однако вы должны знать, что в Safari 5.1 браузер уничтожит плагин (отправит SIG_KILL) через (довольно короткое) время, когда он не получит от него ответа.Из-за этого почти невозможно отладить Safari 5.1;Из-за этого я настоятельно рекомендую вам отладку в Firefox или Chrome.

Это заставит плагин ждать подключения вашего отладчика.Обратите внимание, что в Safari 5.1 изменилось имя процесса плагина;Я забыл, что это сейчас точно, но это определенно не работает, и это не Safari =]

На днях я найду время добавить это в FireBreath по умолчанию np_mainmain.cpp файл ....

2 голосов
/ 19 сентября 2011

Xcode имеет опцию Выполнить -> Присоединить к процессу.Используйте это, чтобы прикрепить к процессу плагина, а не к браузеру.Отсюда вы можете запустить плагин отладки, работающий в 64-битном браузере

0 голосов
/ 04 сентября 2011

Часть "with-dsym" в dwarf-with-dsym означает, что символы находятся в отдельном файле символов, а не в двоичном.

Ваши варианты: - переключиться на простого карлика - скопируйте пакет .dsym из вашей директории для сборки рядом с установленным плагином - вручную загрузить dsym в gdb (по крайней мере, я считаю, что это возможно; хотя я на самом деле этого не делал)

...