Я запускаю XCode, и я хотел бы сбросить NSData *. Переменная, о которой идет речь, является буфером. Есть ли способ сделать это через пользовательский интерфейс или отладчик GDB?
:
Edit
Я перевел свои заметки в ответ.
Я запускаю XCode, и я хотел бы сбросить NSData *. Переменная, о которой идет речь, является буфером. Есть ли способ сделать это через пользовательский интерфейс или отладчик GDB?
:
Edit
Я перевел свои заметки в ответ.
К сожалению, ни одно из предложений пока не разрешило проблему фактического быстрого отображения данных внутри 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 года я думаю, что это время для одного:)
Предполагая, что у вас есть код
NSData* myData;
Затем в lldb вы вводите
me read `[myData bytes]` -c`[myData length]`
Если формат дампа вам не подходит, вы можете добавить '-t', например
me read `[myData bytes]` -c`[myData length]` -t int
Для получения дополнительной справки
help me read
в lldb
Из 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]
В 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."
Щелкните правой кнопкой мыши buffer
и выберите Print description of "buffer"
.
Консоль должна сказать
Printing description of buffer:
<your data here ...>
В Swift это должно сделать трюк:
po String(data:buffer!, encoding: NSUTF8StringEncoding)
Ваш экземпляр данных пуст.
В противном случае будет отображаться не только адрес. -[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
.
Я думаю, что у меня есть это сейчас.
Щелкните правой кнопкой мыши NSData в списке, отображаемом на нем, и нажмите "Показать память" x ".
Я разместил это как ответ на этот соответствующий вопрос:
Как только вы поместите точку останова, запустите, и программа остановится в точке останова, наведите курсор на переменную/значение, которое вы хотите увидеть следующим образом:
Вы также можете поместить 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
). Я демонстрирую это здесь:
Самый простой способ для меня (во время локальной разработки!) - преобразовать в неиспользуемые экземпляры NSString
. Затем значения отображаются прямо в отладчике. Как только я закончу, я уничтожу эти строки кода.
Из этого старого потока
NSString* newStr = [[NSString alloc] initWithData:theData encoding:NSUTF8StringEncoding];