[질문] GDB Attach문 공부중에 질문드립니다.
#include
int main (void)
{
unsigned int sum = 0, j;
while (1) {j++;}
sum = 5 + j;
printf("sum, i = %d\t%d\n", sum, j);
return 0;
}
위에 소스를 attach 하던중에 궁금한점이 있는데요,
1) gdb 안에서 while문을 강제종료한 다음에 다음 명령을 시킬 수 없나요?
2) j값을 임의의 값을 넣은 다음에 sum 값을 볼 수 없나요?
3) j 값에 따른 sum 값을 볼 수 없나요?
4) 위에 소스를 j를 i로 바꾸고 gdb 에서 set i = 0 이런식으로 하면 아래와 같이 구문에러가 뜨는데요. 왜그렇죠?
josh@atFS:~/gdb/atc> gcc -g atc.c
josh@atFS:~/gdb/atc> ls
a.out atc.c
josh@atFS:~/gdb/atc> ./a.out &
[1] 5707
josh@atFS:~/gdb/atc> gdb a.out
GNU gdb 6.2.1
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i586-suse-linux"...Using host libthread_db library "/lib/tls/libthread_db.so.1".
(gdb) attach 5707
Attaching to program: /home/josh/gdb/atc/a.out, process 5707
Reading symbols from /lib/tls/libc.so.6...done.
Loaded symbols for /lib/tls/libc.so.6
Reading symbols from /lib/ld-linux.so.2...done.
Loaded symbols for /lib/ld-linux.so.2
0x080483ad in main () at atc.c:7
7 while (1) {i++;}
(gdb) p i
$1 = 981097437
(gdb) set i = 0
A syntax error in expression, near `= 0'.
(gdb) set i=0
A syntax error in expression, near `=0'.
그럼 답변 부탁드립니다.
감사합니다. ^^
2번과 3번 질문에
2번과 3번 질문에 대한 답: 변수 값을 보거나 다른 값으로 바꾸는 명령 모두 'p' (print)입니다.
1번 질문에 대한 답: 현재 코드 흐름을 N번째 소스로 바꾸고 싶다면 (항상 동작하는 것은 아닙니다.) 프로그램 카운터 레지스터의 값을 N번째 줄로 바꾸면 됩니다. 먼저 N번째 줄의 시작 주소를 알려면:
을 수행하면 시작 주소를 얻을 수 있습니다. (예를 들어 0xbf8e7354라고 합시다) 그리고 나서 레지스터 $pc의 값을 바꾸면 됩니다. (이 레지스터 이름은 시스템에 상관없이 쓸 수 있습니다.)
단 다른 함수로 건너 뛴다거나 하는 일은 stack frame이 망가질 수도 있으니 조심해서 쓰기 바랍니다.
--
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://www.cinsk.org/cfaqs/
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
감사합니다 ^^
답변 감사드립니다...
'gdb 잘 사용하기'라는 자료도 정말 많은 도움이 되더라구요...
저 그런데 'signal 주기'라는 내용이 있던데
어떻게 써야 되는지 감이 안오더라구요
signal 0 라는 것도 있었는데,
잘 모르겠더라구요 -_-
그럼 수고하세요~~
댓글 달기