IT이야기

GDB의 어레이와 같은 포인터를 표시하는 방법

cyworld 2022. 7. 3. 10:11
반응형

GDB의 어레이와 같은 포인터를 표시하는 방법

정의되어 있다고 가정합니다.int a[100]유형print agdb는 자동으로 배열로 표시합니다.1, 2, 3, 4...단, 만약a파라미터로서 함수에 전달되면 gdb는 그것을 일반 int 포인터로 취급합니다.print a다음과 같이 표시됩니다.(int *)0x7fffffffdaa0를 참조하려면 어떻게 해야 합니까?a배열로요?

여기 보세요.즉, 다음과 같은 작업을 수행해야 합니다.

p *array@len

*(T (*)[N])p여기서 T는 유형, N은 요소의 수, p는 포인터입니다.

를 사용합니다.x명령어를 입력합니다.

(gdb) x/100w a

@Ivaylo Strandjev가 여기서 말하는 것처럼 일반적인 구문은 다음과 같습니다.

print *my_array@len
# OR the shorter version:
p *my_array@len

처음 10바이트를 인쇄하는 예my_array:

print *my_array@10

그러나 값을 문자로 해석하려고 하기 때문에 가비지처럼 보일 경우 다음과 같은 다른 포맷 옵션을 강제로 적용할 수 있습니다.

  1. print/x *my_array@10= 16진수
  2. print/d *my_array@10= 부호 있는 정수
  3. print/u *my_array@10= 부호 없는 정수
  4. print/<format> *my_array@10= 일반 형식 문자열에 따라 인쇄합니다.<format>

여기 디버거에서 16바이트를 인쇄하기 위한 몇 가지 실제 예가 있습니다.uint8_t명명된 배열byteArray첫 번째 사람이 얼마나 못생겼는지 보세요.p *byteArray@16:

(gdb) p *byteArray@16
$4 = "\000\001\002\003\004\005\006\a\370\371\372\373\374\375\376\377"
(gdb) print/x *byteArray@16
$5 = {0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff}
(gdb) print/d *byteArray@16
$6 = {0, 1, 2, 3, 4, 5, 6, 7, -8, -7, -6, -5, -4, -3, -2, -1}
(gdb) print/u *byteArray@16
$7 = {0, 1, 2, 3, 4, 5, 6, 7, 248, 249, 250, 251, 252, 253, 254, 255}

이 경우 최적의 버전은 배열을 부호 없는 정수로 인쇄하는 마지막 버전입니다.uint8_t어레이 애프터:

(gdb) print/u *byteArray@16
$7 = {0, 1, 2, 3, 4, 5, 6, 7, 248, 249, 250, 251, 252, 253, 254, 255}

(int[100])*pointer@Ruslan의 댓글에 있는 제안 덕분에 저를 위해 일했습니다.

언급URL : https://stackoverflow.com/questions/14502236/how-to-view-a-pointer-like-an-array-in-gdb

반응형