gdb-优化值分析
我的CPU是arm。如果经过优化,如何计算函数参数值 例如:gdb-优化值分析,gdb,Gdb,我的CPU是arm。如果经过优化,如何计算函数参数值 例如: status_t NuPlayer::GenericSource::setDataSource( int fd, int64_t offset, int64_t length) { resetDataSource(); mFd = dup(fd); mOffset = offset; mLength = length; 上面的函数有3个参数,当我尝试打印第二个参数偏移量时,我会得到以
status_t NuPlayer::GenericSource::setDataSource(
int fd, int64_t offset, int64_t length) {
resetDataSource();
mFd = dup(fd);
mOffset = offset;
mLength = length;
上面的函数有3个参数,当我尝试打印第二个参数偏移量时,我会得到以下结果:
Thread 4 "Binder:15082_3" hit Breakpoint 1, android::NuPlayer::GenericSource::setDataSource (this=0xae63bb40, fd=8, offset=<optimized out>, length=9384436) at frameworks/av/media/libmediaplayerservice/nuplayer/GenericSource.cpp:123
123 resetDataSource();
(gdb) x/i $pc
=> 0xb02aaa80 <android::NuPlayer::GenericSource::setDataSource(int, long long, long long)+12>: blx 0xb0282454 <_ZN7android8NuPlayer13GenericSource15resetDataSourceEv@plt>
(gdb) n
125 mFd = dup(fd);
(gdb) print offset
$1 = <optimized out>
(gdb) p $eax
$2 = void
(gdb) disassemble /m
Dump of assembler code for function android::NuPlayer::GenericSource::setDataSource(int, long long, long long):
122 int fd, int64_t offset, int64_t length) {
0xb02aaa74 <+0>: push {r4, r5, r6, r7, lr}
0xb02aaa76 <+2>: sub sp, #4
0xb02aaa78 <+4>: mov r4, r3
0xb02aaa7a <+6>: mov r5, r2
0xb02aaa7c <+8>: mov r6, r1
0xb02aaa7e <+10>: mov r7, r0
123 resetDataSource();
=> 0xb02aaa80 <+12>: blx 0xb0282454 <_ZN7android8NuPlayer13GenericSource15resetDataSourceEv@plt>
124
125 mFd = dup(fd);
0xb02aaa84 <+16>: mov r0, r6
0xb02aaa86 <+18>: blx 0xb027e5d8 <dup@plt>
0xb02aaa8a <+22>: ldrd r2, r1, [sp, #24]
0xb02aaa8e <+26>: str.w r0, [r7, #224] ; 0xe0
0xb02aaa92 <+30>: movs r0, #0
126 mOffset = offset;
0xb02aaa94 <+32>: strd r5, r4, [r7, #232] ; 0xe8
127 mLength = length;
0xb02aaa98 <+36>: strd r2, r1, [r7, #240] ; 0xf0
128
129 // delay data source creation to prepareAsync() to avoid blocking
130 // the calling thread in setDataSource for any significant time.
131 return OK;
0xb02aaa9c <+40>: add sp, #4
0xb02aaa9e <+42>: pop {r4, r5, r6, r7, pc}
End of assembler dump.
(gdb)
Thread 4“Binder:15082_3”在frameworks/av/media/libmediaplayerservice/NuPlayer/GenericSource.cpp:123处命中断点1,android::NuPlayer::GenericSource::setDataSource(this=0xae63bb40,fd=8,offset=,length=9384436)
123重置数据源();
(gdb)x/i$pc
=>0xB02AA80:blx 0xb0282454
(gdb)n
125 mFd=dup(fd);
(gdb)打印偏移量
$1 =
(gdb)p$eax
$2=无效
(gdb)拆卸/m
函数android::NuPlayer::GenericSource::setDataSource的汇编程序代码转储(int,long,long):
122整数fd,整数偏移,整数长度){
0xB02AA74:推送{r4,r5,r6,r7,lr}
0xB02AA76:子sp,#4
0xB02AA78:mov r4,r3
0xB02AA7A:mov r5,r2
0xB02AA7C:mov r6,r1
0xB02AA7E:mov r7,r0
123重置数据源();
=>0xB02AA80:blx 0xb0282454
124
125 mFd=dup(fd);
0xB02AA84:mov r0,r6
0xB02AA86:blx 0xb027e5d8
0xB02AA8A:ldrd r2,r1,[sp,#24]
0xB02AA8E:str.w r0,[r7,#224];0xe0
0xB02AA92:movs r0,#0
126 mOffset=偏移量;
0xB02AA94:STDR5,r4,[r7,#232];0xe8
127 m长度=长度;
0xB02AA98:strd r2,r1,[r7,#240];0xf0
128
129//延迟数据源创建到prepareAsync()以避免阻塞
130//setDataSource中任何重要时间的调用线程。
131返回OK;
0xB02AA9C:添加sp,#4
0xB02AA9E:pop{r4,r5,r6,r7,pc}
汇编程序转储结束。
(gdb)
我猜它在某个寄存器中,但是$eax的结果是无效的。听起来好像示例代码已经将参数变量分配给了局部变量,所以打印该值将与优化输出参数完全相同
mOffset = offset;
mLength = length;
我猜它在某个寄存器中,但是$eax的结果是无效的
ARM上没有名为eax
的寄存器
要知道参数所在的寄存器,您需要知道
看起来您正在使用32位ARM。从上面的链接:
r0 to r3: used to hold argument values passed to a subroutine
因此,您应该执行
info registers
,验证r0==0xae63bb40
,r1==8
,并在r2
中找到offset
一个问题,offset是int64,但是r2是32位的,r2如何存储64位变量?