2011-11-07 2 views
0

안녕하세요, 어셈블리 명령어에 해당하는 C 문을 얻을 수있는 방법어셈블리 명령은 C 문

0x08048981 <+1165>: call 0x8048404 <[email protected]> 
    0x08048986 <+1170>: jmp 0x8048a52 <main+1374> 
    0x0804898b <+1175>: mov -0x38(%ebp),%eax 
    0x0804898e <+1178>: mov -0x24(%ebp),%edx 
    0x08048991 <+1181>: mov (%eax,%edx,4),%eax 
    0x08048994 <+1184>: sub $0x4,%eax 
=> 0x08048997 <+1187>: mov (%eax),%ebx 

의 기분을 상하게합니다. 주소 0x08048997에있는 명령은 gdb로 표시된 segfault의 위치이며 gdb에서 'disassemble'명령을 사용하여 위 어셈블리를 가져 왔습니다. 당신이 GDB를 사용하고 있기 때문에

덕분에, 카필

+0

Segfault at 0x08048997은 eax가 가리키는 주소가 액세스 가능/쓰기 가능하지 않음을 의미합니다. 소스 또는 전체 디스 어셈블리를 보여줍니다. eax에있는 내용은 jmp 바로 뒤에 0x0804898b에 어떻게 도달합니까? –

답변

3

, 난 당신이 컴파일 GCC를 사용하고 있다고 가정하겠습니다. 컴파일 할 때 -g 플래그를 추가하고 실행 파일을 gdb로로드하십시오. 이 작은 프로그램을 예제로 사용하겠습니다 :

#include <stdio.h> 

int main(void) 
{ 
    char *str = "hello"; 

    *str = 'a'; /* Will cause a segfault, trying to modify read-only memory */ 

    return 0; 
} 

즉. gcc -g -o test test.c

내가 GDB에서 프로그램을 실행하면 충돌이 출력을 생성 할 수 있습니다

: 당신이 볼 수 있듯이 디버깅 정보는 실행 파일에 추가 된 이후

Program received signal SIGSEGV, Segmentation fault. 
0x0000000000400484 in main() at test.c:7 
7  *str = 'a'; 

은, GDB는 오류 당신을 말할 것이다 발생한 줄을 보여줍니다. 또한 list 7 또는 list *0x400484을 사용하여 오류를 일으킨 코드 주위의 코드 줄을 볼 수도 있습니다. 내가 추가 내가 처음에 언급 한 바와 같이, ...이 길고도 짧은 이야기 필요한 것보다 더 이상이 게시물을했다고 생각

... 
    0x0000000000400480 <+12>: mov rax,QWORD PTR [rbp-0x8] 
=> 0x0000000000400484 <+16>: mov BYTE PTR [rax],0x61 
    0x0000000000400487 <+19>: mov eax,0x0 
... 

을 :

또한 여전히 오류가 발생한 어셈블리 명령어를 볼 수 disas을 사용할 수 있습니다 -g 플래그로 gcc를 사용하여보다 효율적으로 디버깅 할 수 있습니다.