我正在调试我们的应用程序的本地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给了我?
一注:这是反汇编*,而不是反编译*。 – 2012-07-20 16:17:06
要在C代码中查找您的bug,Valgrind可能会提供帮助(使用Java,您必须向Valgrind提供选项--smc-check = all) – phd 2012-07-20 23:45:39