一、簡介
Mute Breakpoints,也被稱為「靜態斷點」,是一種適用於現代調試器的斷點機制。與傳統斷點不同的是,Mute Breakpoints並不會中斷程序執行,而是在達到斷點處時靜默地記錄下代碼狀態信息。因為不需要中斷程序,所以它對性能影響比傳統斷點低得多。
與傳統的Symbolic斷點不一樣,Mute Breakpoints不需要為每個斷點都插入一條附加指令,也就不會影響程序執行的速度。同時,Mute Breakpoints可被用於在不在程序運行時插入斷點。
最初,Mute Breakpoints只存在於Instrinsic Symbolic Debugger中,它是ILinux中一種基於符號斷點的一個工具。現在,Mute Breakpoints得到了廣泛應用,如:GDB、LDB、pydev等都已經支持Mute Breakpoints。
二、靜態斷點的實現
Mute Breakpoints是基於軟體斷點打造的,而軟體斷點是通過替換程序語句達到斷點目的的。
#include <stdio.h>
inline int test(int a) {
printf("%d\n", a);
}
int main(void)
{
int a = 5;
test(a);
return 0;
}
如果將上述的代碼插入傳統的調試器中,它會在執行test()函數一次後暫停。但通過Mute Breakpoints,程序的執行不會發生改變,它將只記錄test()函數的狀態並在達到斷點時通知調試器。
三、在LDB中使用Mute Breakpoints
LDB默認使用的是Stop Symbolic Breakpoints。然而,在某些時候(如100ms內的斷點),Stop Symbolic Breakpoints不太適合使用。這時,Mute Breakpoints就派上用場了。
使用Mute Breakpoints在LDB上需要運用「static-breakpoints」命令。使用時,需要指定斷點所在的函數,而不需要指定行。
(lldb) static-breakpoints add --function-regex test
Breakpoint 1: where = a.out`test(), address = 0x10af3b4b8
(lldb) run
Process [87568] launched: '/private/tmp/a.out' (x86_64)
5
Process [87568] exited with status = 0 (0x00000000)
四、與傳統斷點的比較
Mute Breakpoints是一項非常優秀的調試技術,它極大地改進了斷點中斷程序執行的缺陷。相較於傳統斷點,Mute Breakpoints具有以下優勢:
1、對程序執行的影響更小:Mute Breakpoints不需要中斷程序,所以它的執行效率比傳統斷點要高得多;
2、更適合某些類型的問題:Mute Breakpoints對於那些需要長時間運行的程序要比傳統斷點更有用。對於調試大型多線程程序,Mute Breakpoints是非常有利的。
然而,與所有技術一樣,Mute Breakpoints並不是解決所有問題的方法。在某些情況下,如高並發、演算法中的複雜循環等,使用傳統的技術仍然是更明智的選擇。
五、總結
靜態斷點(Mute Breakpoints)是一種極其強大的調試工具,它可以在不降低程序性能的情況下達到調試的目的。Mute Breakpoints和傳統斷點技術之間沒有完全的競爭關係,而是相互補充。只有我們最好理解兩者的優缺點,以便在正確的情況下使用適當的調試技術。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/291273.html