GDB - выполнить текущую строку без движения

Вероятно, об этом спрашивали в другом месте, но было немного сложнее для Google.

Я отлаживаю некоторый код, подобный следующему, в gdb (или, в частности, в cgdb):

if(something) {
  string a = stringMaker();
  string b = stringMaker();
}

Как только я перейду через 'n', курсор достигнет строки 'string b'. На данный момент я могу проверить значение a, но b еще не будет заполнен, так как эта строка не была выполнена. Повторное нажатие 'n' выполнит эту строку, но затем также выйдет за пределы цикла if, и теперь b выйдет из области видимости. Есть ли способ выполнить текущую строку, не двигаясь дальше, чтобы можно было проверить ее результат, прежде чем он выйдет из области видимости?

3 ответа

Повторное нажатие 'n' выполнит эту строку, но затем также выйдет за пределы цикла if, и b теперь выйдет из области видимости.

Проблема в том, что next выполняет слишком много инструкций в b переменная становится недоступной. Вы можете заменить этот сингл next с рядом step а также finish Команды для достижения большей детализации в отладке и остановки сразу после b был построен. Вот пример сеанса GDB для тестовой программы:

[ks@localhost ~]$ cat ttt.cpp 
#include <string>

int main()
{
  if (true)
  {
    std::string a = "aaa";
    std::string b = "bbb";
  }
  return 0;
}
[ks@localhost ~]$ gdb -q a.out 
Reading symbols from a.out...done.
(gdb) start 
Temporary breakpoint 1 at 0x40081f: file ttt.cpp, line 7.
Starting program: /home/ks/a.out 

Temporary breakpoint 1, main () at ttt.cpp:7
7       std::string a = "aaa";
(gdb) n
8       std::string b = "bbb";
(gdb) p b
$1 = ""
(gdb) s
std::allocator<char>::allocator (this=0x7fffffffde8f) at /usr/src/debug/gcc-5.1.1-20150618/obj-x86_64-redhat-linux/x86_64-redhat-linux/libstdc++-v3/include/bits/allocator.h:113
113       allocator() throw() { }
(gdb) fin
Run till exit from #0  std::allocator<char>::allocator (this=0x7fffffffde8f) at /usr/src/debug/gcc-5.1.1-20150618/obj-x86_64-redhat-linux/x86_64-redhat-linux/libstdc++-v3/include/bits/allocator.h:113
0x0000000000400858 in main () at ttt.cpp:8
8       std::string b = "bbb";
(gdb) s
std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string (this=0x7fffffffde70, __s=0x400984 "bbb", __a=...) at /usr/src/debug/gcc-5.1.1-20150618/obj-x86_64-redhat-linux/x86_64-redhat-linux/libstdc++-v3/include/bits/basic_string.tcc:656
656     basic_string<_CharT, _Traits, _Alloc>::
(gdb) fin
Run till exit from #0  std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string (this=0x7fffffffde70, __s=0x400984 "bbb", __a=...) at /usr/src/debug/gcc-5.1.1-20150618/obj-x86_64-redhat-linux/x86_64-redhat-linux/libstdc++-v3/include/bits/basic_string.tcc:656
0x000000000040086d in main () at ttt.cpp:8
8       std::string b = "bbb";
(gdb) p b
$2 = "bbb"

Просто добавьте в код b; линия потом. т.е.

if(something) {
  string a = stringMaker();
  string b = stringMaker();
  b; // Break point here
}

Ну, вы всегда можете

(gdb) p stringMaker(); 

независимо от линии, в которой вы находитесь, учитывая, что stringMaker() доступно. Вы можете выполнять любые операторы, даже с переменными, если эти переменные находятся в текущей области видимости. Для более продвинутого использования вы можете использовать gdbвнутренние переменные ($1,$2 и т.д.) для сохранения определенного результата, чтобы использовать его позже, когда переменные, вовлеченные в это предыдущее вычисление, вышли из области видимости.

Наконец Бог (что бы это ни было) посылает нас gdb Python API, просто введите py и уничтожить ваш код до такой степени, что вы забудете, что вы делали в первую очередь.

Другие вопросы по тегам