2016-06-20 5 views
1

Когда я отлажена код, и нашел:Почему прыгать в недоступный адрес (GDB)

0x08048500 <+0>: push %ebp 
0x08048501 <+1>: mov %esp,%ebp 
... 
0x08048563 <+99>: jmp 0x8048567 <Postion+103> <===0x8048567 doesn't exist an instruction. 
0x08048565 <+101>: dec %edx 
0x08048566 <+102>: cmp %bh,%al 
0x08048568 <+104>: test %edx,%esp 

Q: Почему "JMP 0x8048567" прыжок в < +103>? В нем нет инструкции. В чем смысл? Благодарю.

ответ

1

Почему «jmp 0x8048567» прыгает в < +103>? Не существует инструкции

Очень вероятно, что инструкция на 0x8048567 существует. Вы можете увидеть его с помощью x/4i 0x8048567.

Что, вероятно, происходит в том, что инструкция на 0x8048565 на самом деле не существует, но GDB этого не знает, продолжает разборку одной инструкции за другой и выходит из синхронизации с реальным потоком команд.

+0

Как я могу получить настоящую инструкцию на 0x8048565? –

+0

Там * нет * реальной инструкции в '0x8048565', есть только байты, которые вы можете интерпретировать как десятичные, или шестнадцатеричные, или с плавающей запятой, или как инструкции. Если вы интерпретируете байты в '0x8048565' в качестве инструкций, вы получите' dec% edx', который GDB уже показал вам. –