GDB - 해당되는 글 2건


스텍에서 그값을 가져가서 옆을 가르키게된다.
시스템함수는 리턴어드레스라고 생각을 하는거다.
그래서 하나띤부분에다가 리턴어드레스르 넣어주고
바로 옆에 주소를 가져다가 점프를하기 때문에
바로 옆에 주소를 엑시트 함수의 주소로 바꺼주면된다.↓
그러면 세그멘테이션 파울트 없이 프로그램을 종료할수있다↓


d


실행결과




12

22


212


231
      리눅스  |  2007. 9. 13. 09:08




---------------------------break
list 나 l을 사용하면 프로그램이 10줄씩 보여준다.
특정함수의 list를 보고 싶으면
l minus 또는 list minus 하면 minus함수의 리스트가 보인다.
----------------------------------
disas minus 이렇게 하면 minus 함수가 어셈블리 어로 보인다.
----------------------------------
info reg 하면 레지스터 의 값들이 쭉 보인다.
info break 하면 브레이크의 값들이 쭉 보인다.
-----------------------
라인이나 함수명을 가지고 브레이크포인트를 잡을수있다.
혹은 쓰레드가 있으면 쓰레드넘버를 넣어줄수있고
break 잡는 방법
 break 11 if i==0
 i가영일때 11번 라인에서 멈춰라
 이프안쓰면 11번라인에서는 항상 멈춘다
 braek sum_all이라고하면 sum_all이라는 데서 멈춘다.
Continue하면 브레이크 하고 다시 실행이고
break 해서 또 브레이크 포인트 를 잡아줄수있다.
info braek하면 현재 브레이크 포인터가 설정된되가 보인다.
브레이크 포인트 삭제방법은
delete 2 이런식으로 쓰면 2번 브레이크 포인트 삭제된다.
전체 브레이크 포인트 삭제하고 싶으면 del한다
------------------------
인자를 줘서 계산하는 프로그램이 있으면 r 5 5  또는 run 5 5 이렇게 주면 실행된다.
--------------------------------
bt는 백트레이션이다.
----------------------------------------------
ni 또는 nexti
next i이면 어셈블리 레벨에서 1명령씩 실행한다.
그냥 next는 C에서 다음명령 1개씩 실행한다.





$esp는 스택 포인트를 가르킨다.
     x/10x 16진수로 출력하는데 10개의 데이터를 출력하겠다라는것이다.
        ㅇㅖ)  x/10i 어셈블로출력
                 x/10c문자로출력
                 x/10d 10진수로출력
그러므로 스택의 내용을 출력하고 싶으면
x/10x  $esp
이렇게 하면 스택의 내용이 보인다.


메인에다가 printf를 호출을 하면
main(){
 printf();
 scanf();
 a=10;
}
main에서  프린트 에프를  만나면  실행흐름이 프린트 에프로간다.
프린트에프가 종료가 되면 메인으로 돌아간다.
메일으로 돌아가서 다시 쭉 코드가 실행된다.
스캔에프로가서 스켄에프종료되면다시 메인으로 간다.
이게 자동적으로 되는게 아니라 정보를 스택으로 저장을한다.
스캔에프를 호출을 하면 스캔에프로 갈주소를 저장을 한다.
프린트에프가종료됬을때 다시 되돌아가야할주소가 저장된다
리턴어드레스이다.
일반적으로 C프로그램에서는 메모리 구조를 다음과 같이 사용한다.
----------------
. 배열               |
. 배열               |
. 배열               |  ↓이쪽으로 증가   
. 배열               |
..................... .|
. 지역변수들      |
.지역변수들       |
.지역변수들       |↑이쪽으로 증가  
.지역변수들       |
----------------
SFP                 |
----------------
RET                 |
----------------
스택에 저장될 리턴어드레스가 바뀌면 이상한데로간다.
배열이 많아 지면 지역변수영역도 먹고 RET도 건들게 되서
알수없는 이상한데로 점프를한다.
메인함수도 마찬가지로 처음에생성될때 RET갑도있다.
$eip레지스터는 pc값과 같다고보면된다.

인텔엑스팔육게열의 에셈블리를 사용할때 사용하는
스택 프레임포인터가 SFP가 ebp이다.
메인에서 a라는 함수를 호출했어요 a라는 함수에서 b라는 함수를 호출했어요
그러면은 스택에 어떻게 쌓이냐면은 이런식으로
a라는 함수에서 i라는 지역변수를 참조하기 위해서는 stack포인터가지고는 안되고
스택베이스포인터가있어야된다.->SFP
------
j       |   주소값 72
------
i       |   주소값 76
------->   a함수가 호출하면 ebp가 일로 옮겨가서 ebp를 기준으로 변수를 참조하기 때문에
        |      a함수안에서의  변수만참조가능
SFP  |   주소값 80 ( 96저장ebp가 돌아가야 할 주소)  
------->스텍포인터가 필요하고 베이스포인터가 필요하다
RET  |   주소값 84  (a함수가 호출될때 돌아가야할 주소 100이 바로 저장된다)
------
i       |   주소값 88
-----
i       |   주소값 92
------- >    지역변수가 할당되기 직전에 $ebp가있다.가르키고있다.
        |        ebp를 기준으로 삼아서 ebp-4를 빼주면 i에 접근할수있다.-8하면  j접근
SFP  |  주소값 96               (현재 스택의 주소가들어간다)
------
RET   | 주소값100  main  (실제 함수의 코드영역의 주소가들어가고)
------

*리턴어드레스는 펑션에서 콜할때 자동적으로 저장되어잇다

*메인의 ebp를 스택에 저장을 하고 ebp를 현재 스택 포인터를 갱산한다. esp로

      리눅스  |  2007. 9. 11. 19:49



sokoban's Blog is powered by Daum & Tattertools