Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
gdb-优化值分析_Gdb - Fatal编程技术网

gdb-优化值分析

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个参数,当我尝试打印第二个参数偏移量时,我会得到以

我的CPU是arm。如果经过优化,如何计算函数参数值

例如:

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位变量?