一、简介
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/n/291273.html