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

메모리에 액세스하고 읽기 위해 여러 명령을 사용할 수 있다는 것을 알고 있습니다. 예를 들어 print, p, x …

하지만 GDB에서 디버깅하는 동안 특정 위치에서 메모리 내용을 어떻게 변경할 수 있습니까?



답변

가장 쉬운 방법은 프로그램 변수를 설정하는 것입니다 ( 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

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


답변

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

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

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

(gdb) p idx = 1
$1 = 1

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


답변