3

这可能已在其他地方被问过,但对谷歌来说有点棘手。

我正在 gdb (或更具体地说是 cgdb )中调试如下代码:

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

当我逐步使用“n”时,光标将到达“字符串 b”行。此时我可以检查 a 的值,但由于该行尚未执行,因此尚未填充 b。再次按下“n”将执行该行,但随后也会移出 if 循环,b 现在将超出范围。有没有办法在不继续执行当前行的情况下执行它,以便在超出范围之前检查其结果?

4

3 回答 3

1

再次按下“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"
于 2015-11-28T12:13:58.647 回答
0

之后只需在代码中添加b;该行即可。IE

if(something) {
  string a = stringMaker();
  string b = stringMaker();
  b; // Break point here
}
于 2015-11-25T11:25:13.950 回答
0

那么你总是可以去一个

(gdb) p stringMaker(); 

无论您在哪一行都可以stringMaker()访问。您可以执行任何种类的语句,即使这些变量在当前范围内,也可以涉及变量。对于更高级的用法,您可以使用gdb' 的内部变量($1,$2等)来存储某些结果,以便以后在先前计算中涉及的变量超出范围时使用它。

最后上帝(不管那可能是什么)派我们来gdb Python API。只需键入py并删除您的代码,以至于您会忘记一开始在做什么。

于 2015-11-25T11:57:03.397 回答