我正在调试应用程序的本机C库部分中的一个崩溃,它是通过JNI从Java端调用的。
我找到了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
我已反编译此文件:
[richg@SVR-LRH-ES-2A]$ 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是0xffffffffffffffffffff。我觉得这很可疑。
不过,我在不久前耗尽了x86的知识。我读过一些关于movz的书,我了解它的功能(通过在低24位中填充零,将8位整数转换为32位整数),但我仍然有疑问:
1)0x230部分在调用中的意义是什么?我可以在代码中看到movzbl的其他用途,其中有不同的数字。
2) 我认为如果输入寄存器的值大于8位(这里是%rax),那么这将因溢出而崩溃,对吗?(如果是的话,这将是我崩溃的根本原因。)
0x230是一个偏移量,0x230(%rax)
在正常情况下意味着[rax 0x230]
。
这里没有实际的输入寄存器,rax应该保存一个地址-1看起来不是很有效的地址。这可能就是问题所在。
eax
当然在寄存器转储中-只需查看rax
的下半部分。
我想知道如何从ASM指令中提取寄存器值,并将其放入C中的变量中。 例如:移动文档 DWORD PTR DS:[ESI],EDI (假设EDI持有的值为int)int value=EDI;
用gdb调试程序时,如果想查看寄存器的值,可以使用“i registers”命令(i是info命令缩写),例如: (gdb) i registers rax 0x7ffff7dd9f60 140737351884640 rbx 0x0 0 rcx 0x0 0 rdx 0x7fffffff
我需要只使用%RAX、%RBX、%RCX、%RDX、%RSI和%RDI(还有%RSP和%RBP)编写像素化汇编代码 GCC编写的程序集代码: 已将%dl更改为%rdx:
#include <stdio.h> int main(void) { int a =0; a++; a++; printf("%d\n", a); return 0; } 技巧 PC寄存器会存储程序下一条要执行的指令,通过修改这个寄存器的值,
如何在按钮标题中使用小字母?我正在res/values/strings中创建字符串。带有注册表的xml,但仍有上限。
7.5.6 寄存器的保护和恢复 保护寄存器说明子句的说明格式: USES 寄存器列表 该说明子句要求汇编程序为其生成保护和恢复寄存器的指令序列,即:在进入子程序执行指令之前,把寄存器列表中的寄存器压进堆栈,在结束子程序执行时,把先前压进堆栈的寄存器弹出,以达到保护寄存器的目的。 寄存器列表:列举出在子程序中需要保护的寄存器名,即:在子程序开始时需要把内容进栈的寄存器名。若有多个寄存器名,则在寄存器