Я хочу вивчити вміст std::vector
GDB, як це зробити? Скажімо, це std::vector<int>
заради простоти.
Я хочу вивчити вміст std::vector
GDB, як це зробити? Скажімо, це std::vector<int>
заради простоти.
Відповіді:
Щоб переглянути вектор std :: векторний вміст myVector, просто введіть GDB:
(gdb) print myVector
Це дасть вихід, подібний до:
$1 = std::vector of length 3, capacity 4 = {10, 20, 30}
Щоб досягти вище, вам потрібно мати gdb 7 (я тестував його на gdb 7.01) та якийсь симпатичний принтер python. Процес їх встановлення описаний на gdb wiki .
Більше того, після встановлення вище це добре працює з графічним інтерфейсом налагодження Eclipse C ++ (і будь-яким іншим IDE, що використовує GDB, як я думаю).
$HOME/.gdbinit
необхідний. На даний момент у мене взагалі немає такого файлу і gdb
правильно відображається вміст std::vector
. Однак, оскільки під час моїх "невмілих" спроб я щойно встановив, а потім видалив cgdb
, а я вже libstdc++5
встановив, я не маю уявлення, чому симпатичний друк не працював, поки він працює.
З GCC 4.1.2, щоб надрукувати весь std :: vector <int> під назвою myVector, зробіть наступне:
print *(myVector._M_impl._M_start)@myVector.size()
Щоб надрукувати лише перші N елементів, виконайте:
print *(myVector._M_impl._M_start)@N
Пояснення
Це, мабуть, сильно залежить від вашої версії компілятора, але для GCC 4.1.2 вказівник на внутрішній масив:
myVector._M_impl._M_start
І команда GDB для друку N елементів масиву, що починається з вказівника P:
print P@N
Або в короткій формі (для стандартного .gdbinit):
p P@N
Cannot evaluate function -- may be inlined
_M_impl
тощо) для вашого компілятора під GDB 7.0+, використовуйтеprint /r myVector
"Перегляд" контейнерів STL під час налагодження є дещо проблемою. Ось 3 різні рішення, які я використовував у минулому, жодне з них не є ідеальним.
1) Використовуйте сценарії GDB з http://clith.com/gdb_stl_utils/ Ці сценарії дозволяють надрукувати вміст майже всіх контейнерів STL. Проблема полягає в тому, що це не працює для вкладених контейнерів, як стек наборів.
2) Visual Studio 2005 має фантастичну підтримку для перегляду контейнерів STL. Це працює для вкладених контейнерів, але це для їх реалізації лише для STL і не працює, якщо ви ставите контейнер STL в контейнер Boost.
3) Напишіть власну функцію "друку" (або метод) для конкретного елемента, який ви хочете надрукувати під час налагодження, і використовуйте "виклик", перебуваючи в GDB для друку елемента. Зауважте, що якщо ваша функція друку не буде викликана ніде в коді g ++, це усуне мертвий код, і GDB не знайде функцію 'print' (ви отримаєте повідомлення про те, що функція вкладена). Тому компілюйте з -fkeep-inline-функціями
поставити наступне в ~ / .gdbinit
define print_vector
if $argc == 2
set $elem = $arg0.size()
if $arg1 >= $arg0.size()
printf "Error, %s.size() = %d, printing last element:\n", "$arg0", $arg0.size()
set $elem = $arg1 -1
end
print *($arg0._M_impl._M_start + $elem)@1
else
print *($arg0._M_impl._M_start)@$arg0.size()
end
end
document print_vector
Display vector contents
Usage: print_vector VECTOR_NAME INDEX
VECTOR_NAME is the name of the vector
INDEX is an optional argument specifying the element to display
end
Після перезапуску gdb (або пошуку ~ / .gdbinit) покажіть відповідну довідку, як це
gdb) help print_vector
Display vector contents
Usage: print_vector VECTOR_NAME INDEX
VECTOR_NAME is the name of the vector
INDEX is an optional argument specifying the element to display
Приклад використання:
(gdb) print_vector videoconfig_.entries 0
$32 = {{subChannelId = 177 '\261', sourceId = 0 '\000', hasH264PayloadInfo = false, bitrate = 0, payloadType = 68 'D', maxFs = 0, maxMbps = 0, maxFps = 134, encoder = 0 '\000', temporalLayers = 0 '\000'}}