2015-11-25 93 views
1

這可能是其他地方所要求的,但對谷歌來說有點棘手。gdb - 執行當前行而不移動

我調試像在gdb下面一些代碼(或cgdb更具體地):

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

正如我通過使用「N」的步驟,光標將達到「串b」線。在這一點上,我可以檢查a的值,但由於該行尚未執行,因此b尚未填充。另一個按'n'將執行該行,但是也會移出if循環,現在b將超出範圍。有沒有辦法在不移動的情況下執行當前行,以便在結果超出範圍之前對其結果進行檢查?

+0

我不認爲這可以用gcc或其他編譯器,只在行的粒度發出源到編譯代碼映射。作爲一種解決方法,您可以在'string b ='行設置一個斷點,並附帶一個「watch b」命令,然後繼續。在寫入'b'後應該停止gdb,儘管這可能在構造函數或其他字符串類代碼的中間,而不是在你的代碼中。 –

+0

'手錶'看起來像一個合理的答案,似乎儘可能接近我想要的。如果你把這個作爲答案,我會接受它 – rbennett485

回答

0

只需在代碼後添加代碼b;即可。即

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

這類作品 - 它顯然不是理想的。我說過,因爲我正在調試的文件可能不是我正在編輯的文件,而是從代碼庫中的其他位置編輯的,所以使用我自己的版本進行更改和重建並非易事 – rbennett485

0

那麼你可以隨時到

(gdb) p stringMaker(); 

,無論你是在考慮到stringMaker()是接近直線的。如果這些變量在當前範圍內,則可以執行任何種類的語句,即使涉及變量。對於更高級的用法,可以使用gdb的內部變量($1,$2等)來存儲某些結果,以便稍後在涉及先前計算的變量超出範圍時使用它。

最後上帝(無論那可能)發送給我們gdb Python API。只需鍵入py並拆除你的代碼,以至於你會忘記你在第一個地方做了什麼。

0

「N」的另一個印刷機將執行該行,但隨後也將移動 外,如果環路和b現在將超出範圍

的問題是,next執行過多的說明在b變量變爲不可用。您可以使用stepfinish命令替換此單個next以實現更多的調試粒度,並在構建b後立即停止。這裏是測試程序的示例gdb會話:

[[email protected] ~]$ cat ttt.cpp 
#include <string> 

int main() 
{ 
    if (true) 
    { 
    std::string a = "aaa"; 
    std::string b = "bbb"; 
    } 
    return 0; 
} 
[[email protected] ~]$ 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" 
相關問題