2014-05-20 2 views
1

gdb를 사용하여 매우 간단한 어셈블리 프로그램 (SPARC)을 디버깅 중이며 이상한 문제가 발생했습니다. gdb를 사용하여 argv의 인수를 내 프로그램의 주요 기능에 인쇄하려고합니다. 어떤 이유로 main의 두 번째 인수 인 $ i1의 주소가 -1을 가리 키도록 변경됩니다. 다음은 gdb 세션의 복사 붙여 넣기입니다.gdb에서이 주소가 변경되는 이유는 무엇입니까?

(gdb) p/x $i1 
$1 = 0xffbff084 
(gdb) x/x 0xffbff084 
0xffbff084:  0xffbff1e4 
(gdb) x/s 0xffbff1e4 
0xffbff1e4:  "..." 
(gdb) x/x 0xffbff088 
0xffbff088:  0xff 
(gdb) x/x 0xffbff084 
0xffbff084:  0xff 

인쇄 된 실제 경로 대신 "..."을 사용했습니다.

첫 번째 인수를 올바르게 인쇄했지만 두 번째 인수의 주소를 얻는 대신 gdb는 다음 값이 -1이라고 말합니다. 첫 번째 문자열의 주소를 다시 확인하기 위해 되돌아갔습니다. gdb에서는 -1 일 뿐이라고 말했지만, 다른 것으로 밝혀졌습니다.

이 다중 스레드 프로그램이 아닙니다, 그래서 주소 변경 할 수있는 것을 모르는 :/

편집 : X/s는 주소의 내용을 인쇄에 사용 후에 일이 나타납니다 만 .

답변

5

gdb 'x'명령은 슬래시 뒤에 옵션으로 인쇄 형식과 크기를 허용합니다. manual 그것은 말한다 :

때마다 당신은 X와 단위 크기를 지정, 그 크기가 기본 단위는 X를 사용하여 다음 번이된다.

또한 말씀하시기 년대 '형식

,'B '로 단위 크기의 기본값은 명시 적으로 부여하지 않는 한.

그래서 무슨 일이 일어나고 있는지 명령 x/s에게 제공 한 후, 다음 x 명령 바이트 길이로 해석된다는 것이다. 따라서 검사하려고하는 메모리의 첫 번째 바이트 만 인쇄합니다. 0xff가됩니다.

x/x 대신 x/xw으로 주소를 인쇄 해보십시오.

관련 문제