Подтвердить что ты не робот

Просмотр содержимого NSData в XCode

Я запускаю XCode, и я хотел бы сбросить NSData *. Переменная, о которой идет речь, является буфером. Есть ли способ сделать это через пользовательский интерфейс или отладчик GDB?

: eThis is what I see at runtime

Edit

Я перевел свои заметки в ответ.

4b9b3361

Ответ 1

К сожалению, ни одно из предложений пока не разрешило проблему фактического быстрого отображения данных внутри NSData.

Я написал простой метод, который работает так, как мне это нужно. Из окна GDB я могу ввести print [Util dumpData:theData], и я получу хороший отформатированный вывод.

+(void) dumpData:(NSData *)data
{
    unsigned char* bytes = (unsigned char*) [data bytes];

    for(int i=0;i< [data length];i++)
    {
        NSString* op = [NSString stringWithFormat:@"%d:%X",i,bytes[i],nil];
        NSLog(@"%@", op);
    }
}

Выход NsLog

0:24
1: 0
2: 4
3: 0
4: 0
5: 0

Ответ 2

Никто никогда не отвечал на вопрос. Через 2 года я думаю, что это время для одного:)

Предполагая, что у вас есть код

NSData* myData;

Затем в lldb вы вводите

me read `[myData bytes]` -c`[myData length]`

Если формат дампа вам не подходит, вы можете добавить '-t', например

me read `[myData bytes]` -c`[myData length]` -t int

Для получения дополнительной справки

help me read

в lldb

Ответ 3

Из Xcode 5 (lldb) вы можете использовать следующее:

po (NSString *)[[NSString alloc] initWithData:buffer encoding:4]

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

Итак, если вы отлаживаете что-то вроде запроса JSON, который завершен в NSURLSessionDataTask, данные запроса находятся в task.originalRequest.httpBody, и вы можете просмотреть это в отладчике с

po (NSString *)[[NSString alloc] initWithData:task.originalRequest.HTTPBody encoding:4]

Ответ 4

В lldb для работы с объектами NSData выполняется следующее:

Вы можете получить адрес из байтов для использования с различными командами отладчика, например:

p (void *)[buffer bytes]

Вы видите что-то вроде этого:

(void *) $32 = 0x0b5e11f0

Если вы знаете, что базовые данные представляют собой строку , вы можете сделать это:

p (char *)[buffer bytes]

и отладчик выведет:

(char *) $33 = 0x0b5e11f0 "This is the string in your NSData, for example."

Ответ 5

Щелкните правой кнопкой мыши buffer и выберите Print description of "buffer".

Консоль должна сказать

Printing description of buffer:
<your data here ...>

Ответ 6

В Swift это должно сделать трюк:

po String(data:buffer!, encoding: NSUTF8StringEncoding)

Ответ 7

Ваш экземпляр данных пуст.

В противном случае будет отображаться не только адрес. -[NSData description] включает распечатку содержимого данных. Байты сгруппированы в четыре и печатаются в шестнадцатеричном виде с ведущим 0-заполнителем:

char arr[] = {0x1, 0x2, 0xA, 0x4, 0xF};
NSData * dat = [NSData dataWithBytes:arr length:5];
NSLog(@"%@", dat);

2012-07-17 22: 24: 48.973 PrintDat [61264: 403] < 01020a04 0f >

Использование po dat в командной строке отладчика даст вам те же результаты, в том числе адрес:

(NSData *) $1 = 0x00007f98da500180 < 01020a04 0f >

В маршруте контекстного меню, предложенном Anshu, также используется метод description.

Ответ 8

Я думаю, что у меня есть это сейчас.

Щелкните правой кнопкой мыши NSData в списке, отображаемом на нем, и нажмите "Показать память" x ".

Ответ 9

Я разместил это как ответ на этот соответствующий вопрос:

Как только вы поместите точку останова, запустите, и программа остановится в точке останова, наведите курсор на переменную/значение, которое вы хотите увидеть следующим образом:

enter image description here

Вы также можете поместить NSLog(@"%@", yourLabel.text); для просмотра содержимого этого типа метки/другого объекта.

Еще одна опция - запустить GDB в консоли следующим образом:

gdb
attach <your process name>

И затем используйте команду po (print-object), чтобы просмотреть значение переменной следующим образом:

po variableName

Чтобы просмотреть значение примитивных типов (int, float, long, double, char и т.д.), вы можете просто использовать команду print во время запуска GDB в консоли например:

print yourPrimitiveVariable

Надеюсь, это поможет!

EDIT:

С помощью команды po вы можете распечатать значение объекта, используя имя свойства (self.myProperty) или имя ivar (возможно, _myProperty). Я демонстрирую это здесь:

enter image description here

Ответ 10

Самый простой способ для меня (во время локальной разработки!) - преобразовать в неиспользуемые экземпляры NSString. Затем значения отображаются прямо в отладчике. Как только я закончу, я уничтожу эти строки кода.

Из этого старого потока

NSString* newStr = [[NSString alloc] initWithData:theData encoding:NSUTF8StringEncoding];

enter image description here