ios调试参数在堆栈的位置问题

最近在调试一个函数,函数是这样的

void glVertexAttribPointer(
GLuint index,
GLint size,
GLenum type,
GLboolean normalized,
GLsizei stride,
const GLvoid * pointer);}

我要断下第六个参数,找出它的数值,在GDB中断下,打印堆栈是这样的
(gdb) x/4xw $sp
0x27d3cc34: 0x00000000 0x00000000 0x007d8838 0x1970e6e0

第六个参数是指针,应该是堆栈里的第二个,为什么第二个是空指针,但函数的这个参数不可能是空指针

然后我打印出参数第7个位置的值0x007d8838,得到的数组和正确的值很接近,我问了一下青蛙老大他说可能是第五个参数占了堆栈的两个位置,深深滴怀疑不解,跪求大牛解答一下,明天就要交工了

求大牛点拨一下这个堆栈到底神马情况

GLsizei是什么类型?它的值是0吗?

有0也有4,上面的那个是0

堆栈的第一个就是这个值啊

如果是0那值就是对的,你就要看看GLsizei是什么类型的值,有多长。如果是64位的话,那我觉得确实可能是占了8字节

什么是对的呀,就是说指针就是空的意思吗,还是说是0x007d8838,如果是四了?

GLsizei并不是一个指针啊,所以堆栈里存放的直接就是它的值,就是0啊!如果是4的话,我想应该是0x00000010 0x00000000吧。你先看看GLsizei的类型是怎么定义的,它的长度是不是8字节

我发现可能不是长度的问题了,感觉堆栈里面的值都有些问题,从函数的第五个参数开始都不对劲,请问一下我是哪里操作错了吗,我下的断点b glVertexAttribPointer,断下后直接X /10xw $sp,然后值依次是五六七八参数的是吗,有木有问题,寄存器的值都很正常一到堆栈感觉值都不对劲了

这个操作看起来是没问题的,这样的话不排除gdb本身的问题,你参照这个帖子换lldb试试

找到问题啦

搞定了,找到问题了,送给大家一个教训,千万别在GDB里面直接断函数,断下来的堆栈全部是错的。。。被坑死了,还是要在IDA里面找到偏移然后断地址才行