LLDB: как проверить unordered_map

Большинство других контейнеров STL печатаются нормально, но unordered_map — это беспорядок.

Я использую operator << для печати, но речь идет не о печати, а о том, когда у меня произошел сбой, и я хочу распечатать свой хеш из подсказки LLDB.

Я не могу вызвать что-то вроде call cout << var, потому что это не работает.

Нет ли решения, кроме, например, связывание функции шаблона, которая сама использует cout <<? Это даже сработает? (Я пытаюсь, но это не работает, потому что я должен заранее знать, какие типы параметров шаблона будут для него генерировать и связывать код для них)


person Steven Lu    schedule 11.09.2013    source источник


Ответы (2)


Вы должны просто иметь возможность исследовать сам объект unordered_map, не вызывая для него методы.

Например, возьмем эту простую программу:

#include <iostream>
#include <string>
#include <unordered_map>

using namespace std;

int main() {
    unordered_map<int, string> map;
    map[0] = "mary";
    map[1] = "had";
    map[2] = "a";
    map[3] = "little";
    map[4] = "lamb";

    return 0;
}

$ clang++ -std=c++11 -stdlib=libc++ -g unmap.cpp -o unmap
$ lldb unmap
Current executable set to 'unmap' (x86_64).
(lldb) break set --name main

lldb вывод не показан для краткости

(lldb) proc launch

n введено 5 раз до return 0; утверждения

(lldb)
Process 18063 stopped
* thread #1: tid = 0x1c03, 0x0000000100000aea unmap`main + 1082 at unmap.cpp:15, stop reason = step over
    frame #0: 0x0000000100000aea unmap`main + 1082 at unmap.cpp:15
   12       map[3] = "little";
   13       map[4] = "lamb";
   14
-> 15       return 0;
   16   }
   17

А затем исследуйте объект с помощью p:

(lldb) p map[0]
(std::__1::unordered_map<int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::hash<int>, std::__1::equal_to<int>, std::__1::allocator<std::__1::pair<const int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > >::mapped_type) $2 = "mary"
(lldb) p map[1]
(std::__1::unordered_map<int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::hash<int>, std::__1::equal_to<int>, std::__1::allocator<std::__1::pair<const int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > >::mapped_type) $3 = "had"
(lldb) quit

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

$ lldb -version
LLDB-179.5

(то есть тот, который поставляется с пакетом командной строки Xcode 5 DP 6)

person trojanfoe    schedule 11.09.2013
comment
как подключиться к процессу ARM из lldb из cmdline? Могу ли я подключить два экземпляра к одной и той же работающей программе? (что-то мне подсказывает, что нет...) Как насчет обновления версии lldb в Xcode без обновления Xcode? (Я хочу сохранить Xcode 4 из-за плагина vim). У меня есть сам проект lldb, который успешно компилируется через Xcode. - person Steven Lu; 11.09.2013
comment
@StevenLu Нет, я не знаю, как вы это сделаете, но вы можете взаимодействовать с LLDB из Xcode с помощью консоли отладчика. Я бы попробовал версию LLDB, которую вы должны увидеть, сможете ли вы делать такие вещи, как p map[0]. - person trojanfoe; 11.09.2013
comment
У меня есть LLDB 179.6. Не получается: p this->memberUnorderedMap[0] error: invalid use of 'this' outside of a non-static member function p memberUnorderedMap[0] error: use of undeclared identifier 'memberUnorderedMap' (я могу получить супер уродливый дамп всей карты, используя p this->memberUnorderedMap) - person Steven Lu; 11.09.2013
comment
@StevenLu Почему вы используете this->? - person trojanfoe; 11.09.2013
comment
Это единственный способ заставить его вообще что-либо печатать в экземпляре объекта. - person Steven Lu; 11.09.2013
comment
@StevenLu О, хорошо. Мне нужно увидеть код, чтобы увидеть, как это можно сделать. - person trojanfoe; 11.09.2013
comment
просто сделайте карту членом класса. Затем сломайте программу в середине функции-члена этого класса. - person Steven Lu; 11.09.2013

Если вы хотите использовать lldb с открытым исходным кодом и собрать его самостоятельно, есть синтетический провайдер для unordered_map, который вы могли бы использовать:

Автор: enrico Дата: 4 сентября 12:48:52 2013 Новая редакция: 189964

URL-адрес: http://llvm.org/viewvc/llvm-project?rev=189964&view=rev Журнал: Это пример синтетического провайдера для неупорядоченных (мульти) карт и наборов libc++ Спасибо Джареду Граббу за его написание и распространение!

person Enrico Granata    schedule 11.09.2013
comment
неясно, как интегрировать это с Xcode, поэтому я могу каждый раз подключать и отлаживать приложение ARM без какого-либо сложного процесса настройки. - person Steven Lu; 12.09.2013
comment
Да, отладка на телефоне, вероятно, является сложной проблемой во всем этом подходе. То, что вы можете попробовать, не обещая, что это сработает, — это просто извлечь скрипт Python из источников ToT и «импортировать командный скрипт» в ваш сеанс Xcode. Это может работать или не работать в зависимости от версии Xcode/LLDB, которую вы используете, и от того, насколько с тех пор развился API SB (с точки зрения доступных вызовов/исправленных ошибок). Обычно эти скрипты пишутся без особого внимания к совместимости со старыми LLDB, и такое тестирование не проводится. Это может сработать. Если это так, это ваш счастливый день :) - person Enrico Granata; 12.09.2013
comment
Ага. Однако мои шаблоны-красивые-принтеры настолько эффективны, что регистрация с достаточной степенью детализации в значительной степени позволяет выполнить любую мыслимую работу на этом этапе. Мне, вероятно, было бы лучше работать с сетевой системой регистрации, чем пытаться настроить отладчик. - person Steven Lu; 12.09.2013