주소 열과 내용 열 구별하기

메모리 창에서 왼쪽의 긴 숫자는 저장 위치를 뜻하고, 가운데의 두 자리 숫자들은 그 위치부터 읽은 실제 바이트입니다. 오른쪽 ASCII 열은 같은 바이트를 출력 가능한 문자로 해석한 보조 표시입니다. 주소와 내용이 모두 16진수로 보여 혼동하기 쉬운데, 어떤 위치에 값이 들어 있는지와 그 값이 다른 위치를 가리키는지는 별도로 판단해야 합니다. DBG Desk는 지정한 주소부터 256바이트를 읽습니다. 한 행은 16바이트로 나누어 표시되므로 다음 행의 시작 주소는 앞 행보다 16만큼 큽니다. 행이 나뉜 것은 표시 방식이며 데이터 구조의 경계라는 뜻은 아닙니다.

정수는 크기와 바이트 순서를 함께 보기

x86 계열은 일반적으로 리틀 엔디언 방식으로 값을 저장합니다. 예를 들어 32비트 정수 0x12345678을 메모리에서 보면 낮은 주소부터 78 56 34 12 순서로 나타납니다. 화면의 바이트를 왼쪽부터 이어 붙였다고 정수의 표기와 같아지는 것은 아닙니다. 또한 같은 네 바이트를 부호 있는 정수로 해석할지 없는 정수로 해석할지에 따라 의미가 달라집니다. 타입과 크기를 알지 못한 채 모든 값을 주소로 추정하면 엉뚱한 곳을 따라가게 됩니다. 해당 값을 읽거나 쓰는 명령어의 피연산자 크기를 확인하고 소스의 선언과 대조하는 편이 안전합니다.

문자 열은 부분적인 해석일 뿐

ASCII 열에서 점으로 보이는 바이트는 데이터가 없다는 의미가 아닙니다. DBG Desk는 영문 출력 가능 범위를 벗어나는 값을 점으로 표시합니다. 숫자 0, 줄바꿈, 한글 UTF-8의 일부 바이트도 점으로 보일 수 있습니다. 따라서 문자열이 끊겨 보이면 먼저 인코딩과 끝을 나타내는 조건을 확인하세요. C 문자열은 보통 널 바이트를 끝으로 사용하지만 길이를 따로 저장하는 버퍼도 있고, 문자열 객체에는 포인터와 길이 같은 관리 정보가 포함될 수 있습니다. 객체의 시작 주소를 열었다고 반드시 첫 문자부터 보이는 것은 아닙니다. 실제 문자 데이터가 놓인 위치를 찾아 읽어야 합니다.

읽기 실패가 알려주는 범위

메모리를 읽을 수 없다는 응답은 입력한 주소가 현재 프로세스에서 유효하지 않거나 읽기 권한이 없는 영역일 수 있다는 단서입니다. 다른 실행에서 얻은 주소, 해제된 객체의 주소, 정수를 포인터로 잘못 해석한 값인지 먼저 확인합니다. 조회 범위가 메모리 영역의 끝을 넘어 256바이트 전체를 읽지 못하는 상황도 생각해야 합니다. 화면에서 읽히는 값이라고 해서 객체가 여전히 살아 있다는 보장은 없습니다. 해제된 메모리가 한동안 읽힐 수 있기 때문입니다. 조회 결과를 프로그램의 할당과 해제 시점, 현재 정지 위치와 함께 해석해야 결론을 내릴 수 있습니다.

네 바이트를 직접 비교하기

연습용으로 0x12345678이라는 값을 저장한 작은 정수를 준비하면 바이트 순서를 확인하기 좋습니다. 변수에 값을 쓰는 명령어 이후에 정지해 해당 저장 위치를 보고, 값을 0x12345679로 바꿔 다시 빌드한 경우와 비교합니다. 낮은 바이트가 어떻게 바뀌는지 예상한 뒤 화면을 확인하세요. 주소 자체는 재실행마다 같을 필요가 없으므로 숫자를 외우는 대신 현재 저장 위치를 다시 찾아야 합니다. 두 값의 바이트 배치를 설명할 수 있으면 더 큰 구조체에서도 필드 크기와 정렬을 구분하는 출발점이 생깁니다. 패딩이 있는 구조체는 선언 순서만으로 모든 바이트를 데이터라고 해석하지 마세요.

x86 리틀 엔디언 예
value:  0x12345678
bytes:  78 56 34 12