2012-07-20 33 views
1

我正在調試我們的應用程序的本地C庫部分中的崩潰,該部分是通過JNI從Java端調用的。movzbl如何與寄存器值0xffffffffffffffff交互?

我發現的Java留給我崩潰文件的這一部分:

# JRE version: 6.0_16-b01 
# Java VM: Java HotSpot(TM) 64-Bit Server VM (14.2-b01 mixed mode linux-amd64) 
# Problematic frame: 
# C [binaryname.so+0x2760] functionname+0x59 

我反編譯如下:

[[email protected]]$ gdb binaryname.so 
... 
(gdb) disas 0x275e 0x2768 
Dump of assembler code from 0x275e to 0x2768: 
0x000000000000275e <functionname+87>: rex.RB clc 
0x0000000000002760 <functionname+89>: movzbl 0x230(%rax),%eax 
0x0000000000002767 <functionname+96>: test %al,%al 

看着我的堆棧跟蹤,又和我可以看到:

RAX=0xffffffffffffffff, RBX=0x00002aab6cdf46c8, RCX=0x00002b70e0f15d73, RDX=0x000000005d5ffbe0 
RSP=0x00000000463f9710, RBP=0x00000000463f9770, RSI=0x00002b70e0f27820, RDI=0x00000000463f9748 
R8 =0x00002b70e0f27838, R9 =0x000000005cfa9828, R10=0x000000005cfa9478, R11=0x000000005cfa9440 
R12=0x00002aab84654000, R13=0x00002aab6cdf46c8, R14=0x00000000463f9808, R15=0x00002aab84654000 
RIP=0x00002aab79316760, EFL=0x0000000000010206, CSGSFS=0x0000000000000033, ERR=0x0000000000000004 
TRAPNO=0x000000000000000e 

所以%rax是0xffffffffffffffff。這看起來對我很可疑。不過,前段時間我已經耗盡了我對x86的認識。我已經做了一些關於movz的閱讀,我明白它的作用(通過用零填充低24位從8位整數到32位),但我仍然有問題:

1)呼叫中的0x230部分有什麼意義?我可以在代碼中看到movzbl的其他用法,其中有不同的數字。

2)我正確地認爲,如果輸入寄存器的值大於8位(這裏%rax的確如此),那麼這會因溢出而崩潰? (如果是這樣,這將是我崩潰的根本原因。)

3)爲什麼寄存器轉儲Java中的%eax給了我?

+1

一注:這是反彙編*,而不是反編譯*。 – 2012-07-20 16:17:06

+0

要在C代碼中查找您的bug,Valgrind可能會提供幫助(使用Java,您必須向Valgrind提供選項--smc-check = all) – phd 2012-07-20 23:45:39

回答

1

0x230是一個偏移量,0x230(%rax)意味着在正常的世界中[rax+0x230]

因此movzbl 0x230(%rax),%eax最終意思是movzx eax, byte ptr [rax+0x230]

這裏沒有實際的輸入寄存器,rax應該保存一個地址。 -1作爲地址看起來不太有效。這可能是問題所在。

eax當然是在寄存器轉儲 - 只要看看rax的下半部分。

+0

感謝您的幫助!我還沒有發現我的錯誤,但這幫助我瞭解了ASM的含義,並給了我一些線索。再次感謝! – 2012-07-24 15:29:37