GDB를 사용하여 메모리 내용을 수정하는 방법은 무엇입니까?


답변:


124

가장 쉬운 방법은 프로그램 변수를 설정하는 것입니다 ( GDB : 할당 참조 ).

(gdb) l
6       {
7           int i;
8           struct file *f, *ftmp;
9
(gdb) set variable i = 10
(gdb) p i
$1 = 10

또는 주소로 임의 (쓰기 가능) 위치를 업데이트 할 수 있습니다.

(gdb) set {int}0x83040 = 4

더있다. 설명서를 읽으십시오 .


4
임의의 메모리 위치에 액세스하기 전에 프로그램 변수를 설정해야합니까? 두 번째 set 명령을 바로 실행할 수 없습니까?
Spidey 2012 년

또한, 다음 set (str[6]) = 'c'과 같은 배열이있는 경우 작동합니다char str[]
xealits

29

Nikolai가 말했듯이 gdb 'set'명령을 사용하여 변수 값을 변경할 수 있습니다.

'set'명령을 사용하여 메모리 위치를 변경할 수도 있습니다. 예. Nikolai의 예에서 확장 :

(gdb) l
6       {
7           int i;
8           struct file *f, *ftmp;
9
(gdb) set variable i = 10
(gdb) p i
$1 = 10

(gdb) p &i
$2 = (int *) 0xbfbb0000
(gdb) set *((int *) 0xbfbb0000) = 20
(gdb) p i
$3 = 20

이것은 유효한 포인터에 대해 작동해야하며 적절한 데이터 유형으로 캐스트 될 수 있습니다.


set {char[100]}(0x00) = ""주소 0x00
davenpcj

16

여기에 제공된 답변을 확장합니다.

set idx = 1변수를 설정하기 위해 수행 할 수 있지만 변수 이름이 set 하위 명령과 충돌 할 수 있으므로 해당 구문은 권장되지 않습니다. 예를 들어 set w=1유효하지 않습니다.

즉, 다음 구문을 선호해야합니다. set variable idx = 1또는 set var idx = 1.

마지막으로, 표현식을 평가하기 때문에 신뢰할 수있는 이전 인쇄 명령을 사용할 수 있습니다. 유일한 차이점은 식의 결과를 인쇄한다는 것입니다.

(gdb) p idx = 1
$1 = 1

여기에서 gdb에 대한 자세한 내용을 읽을 수 있습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.