2015년 1월 22일 목요일

ddd 를 이용하여 구조체 내에 padding 된 byte 의 쓰레기값 관찰하기.

#include

typedef struct _a
{
char a;
int  i;
}PAD;

typedef struct __attribute__((packed)) _b
{
char a;
int  i;
}PACK;

int main(int argc, char * argv[] )
{
PAD  pad = { 'a', 10 };
PACK pack= { 'b', 20 };

printf( "PAD  char  : %c\n", pad.a );
printf( "PACK char  : %c\n", pack.a );


printf( "size PAD  : %d\n", sizeof(PAD ) );
printf( "size PACK : %d\n", sizeof(PACK) );

return 0;
}


위 코드를 이용하여 ddd 를 사용해보자.


(gdb) print pad.a
$9 = 97 'a'

(gdb) print pad
$10 = {a = 97 'a', i = 10}

pad 의 주소를 출력
(gdb) print &pad
$13 = (PAD *) 0xbffff240


pad.a 의 주소를 출력(값도 같이 나온다.)
(gdb) print &pad.a
$14 = 0xbffff240 "a\324\025"    

a 는 초기화된 값인데, 그 뒤의 값은 왜 저렇게 나오는지 모르겠다.


pad.a 의 주소를 이용하여 word(32bit 컴에서 4 byte) 를 출력
(gdb) x /wx &pad.a
0xbffff240: 0x0015d461

pad.a 의 주소를 이용하여 1 byte 를 출력
(gdb) x /bx &pad.a
0xbffff240: 0x61

( pad.a + 1 ) 주소를 이용하여 1 byte 를 출력
(gdb) x /bx &pad.a + 1
0xbffff241: 0xd4

( pad.a + 2 ) 주소를 이용하여 1 byte 를 출력
(gdb) x /bx &pad.a + 2
0xbffff242: 0x15

( pad.a + 3 ) 주소를 이용하여 1 byte 를 출력
(gdb) x /bx &pad.a + 3
0xbffff243: 0x00





댓글 없음:

댓글 쓰기

팔로어