Как отладить программу Objective-C (pbcopy, поставляемую Apple) с помощью gdb? - PullRequest
1 голос
/ 15 мая 2009

Мне нужно отладить программу target-c. При установке точки останова на функцию main (), я получил:

Reading symbols from /usr/bin/pbcopy...done.
(gdb) break main
Function "main" not defined.

Вызов «start» из ответа на ту же ошибку. Я подозреваю, что способ ведения дел отличается на макс ос х?

Что эквивалентно программе target c?

Кстати, как прервать функцию выхода ()?

Редактировать: я пытаюсь взломать - [NSApplication run], как предложено Линдси

(gdb) file pbcopy
Reading symbols for shared libraries ........ done
Reading symbols from /usr/bin/pbcopy...done.
(gdb) break -[NSApplication run]
Breakpoint 1 at 0x35a8356
(gdb) run
Starting program: /usr/bin/pbcopy 
Reading symbols for shared libraries +++++++.................................................................... done
Breakpoint 1 at 0x95a97356

helo
^C
Program received signal SIGINT, Interrupt.
0x9574eeda in read$UNIX2003 ()
(gdb) bt
#0  0x9574eeda in read$UNIX2003 ()
#1  0x94d4e5b6 in _NSReadFromFileDescriptor ()
#2  0x94d4e4b6 in -[NSConcreteFileHandle readDataOfLength:] ()
#3  0x94d7f2fa in -[NSConcreteFileHandle readDataToEndOfFile] ()
#4  0x00002a11 in ?? ()
#5  0x00002736 in ?? ()
(gdb) info breakpoints
Num Type           Disp Enb Address    What
1   breakpoint     keep y   0x95a97356 <-[NSApplication run]+6>
(gdb) 

Это довольно странно, как GDB находит адрес символа, но не ломается в нем ... Кстати, кажется, GDB меняет адрес точки останова после загрузки динамической библиотеки. Но это не повредит мне, так как я полагаю, что ld нужно сделать переезд. Видя следы стека, я вижу много ?? что позволяет мне предположить, что обычный способ запуска приложения здесь не используется (большое предположение ...: /)

Ответы [ 2 ]

3 голосов
/ 15 мая 2009

pbcopy - это инструмент командной строки, а не приложение, поэтому нет причины, по которому он когда-либо вызывал бы [NSApplication run]. Точка останова разрешается, потому что она (по любой причине) связана с платформой AppKit.

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

Если вы объясните, что вы пытаетесь достичь в целом, у вас могут появиться лучшие предложения о том, как действовать.

2 голосов
/ 15 мая 2009

Создавали ли вы свое приложение Objective-C, используя шаблон проекта Какао? Если да, то какой? У многих есть основная функция.

Можете ли вы опубликовать свою основную функцию? В основной функции введите:

int main(int argc, char *argv[]) {
#error Да, я компилируюсь!

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    int retVal = UIApplicationMain(argc, argv, nil, nil);
    [pool release];
    return retVal;
}

Теперь, соберите ваше приложение, вы получили ошибку? Если нет, то по какой-то причине ваш код с функцией main фактически не компилируется. Убедитесь, что это так.

Редактировать 14 мая 2009 г. @ 5:22 EST : Вы можете использовать b - [NSApplication run] сломаться, когда приложение получает команду на запуск.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...