最近在X86虚拟机上调试单板代码,使用gdb的时候遇到一个问题。
有时候我们为一个函数设置断点,但是这个函数被调用到的频率太大,会频繁的被断住,实际上只需要一些特殊的情况才需要停住, 这就需要在断点处进行条件判断。
如果需要判断的是一个全局变量,则可以这样:
b func if g_val=0 //当全局变量为0的时候,才会在func的入口处停止。
或者是一个全局地址:
b func if *(int*)address=0 //当地址address的int型数据为0的时候,才在func的入口处停止。
但是如果你想判断一个函数入参的时候,如果这样做:
b func if p1=0 //p1是func(int p1, int p2, int p3, int p4)的第一个入参名。
会返回错误:
No symbol "p1" in current context.
为什么?这是因为p1是一个临时变量,你在进行断点设置的时候(进行全局动作)这个参数不存在的。
那么怎么对函数的输入参数进行判断呢? 这需要先了解一下不同平台的函数调用和参数传递规则。
如果是我们熟悉的arm板上,则很明了,一般对r0-r3寄存器值进行判断就好了,但是在x86上该怎么做呢?
首先,看下面这篇文档了解下基本概念: