2017-02-28 8 views
1

私のCPUはアームです。最適化されている場合、関数のパラメータ値を調べる方法はありますか?例えばgdb - 最適化された値の分析

:機能上

status_t NuPlayer::GenericSource::setDataSource(
     int fd, int64_t offset, int64_t length) { 
    resetDataSource(); 

    mFd = dup(fd); 
    mOffset = offset; 
    mLength = length; 

は、3つのパラメータを持っている私は第2のオフセットパラメータを印刷しようとすると、私は結果の下に表示されます:

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 <[email protected]> 
(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 <[email protected]> 

124 
125  mFd = dup(fd); 
    0xb02aaa84 <+16>: mov r0, r6 
    0xb02aaa86 <+18>: blx 0xb027e5d8 <[email protected]> 
    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) 

私はそれはいくつかのレジスタにだと思うけど$ eaxの結果は無効です。

答えて

1

私はそれはいくつかのレジスタにだと思うが、$ eaxにの結果は無効となります。

ARMにはeaxというレジスタはありません。

パラメータが入っているレジスタを知るには、calling conventionを知る必要があります。

32ビットARMを使用しているようです。上記のリンクから:

r0 to r3: used to hold argument values passed to a subroutine 

ですから、info registersを行う必要があり、r0 == 0xae63bb40r1 == 8r2offsetを見つけることを確認してください。

+0

1つの質問では、オフセットはint64_tですが、r2は32ビットです。r2ストレージはどのように64ビット変数になりますか? – beetlej

1

サンプルコードのようなサウンドは、パラメータ変数をローカル変数に既に割り当てています。その値を出力すると、最適化された出力パラメータとまったく同じになります。

mOffset = offset; 
mLength = length; 
関連する問題