HOME 자유게시판

자유게시판

자유게시판 More information
gdb 를 이용한 디버그 과정의 기록

onionmixer 2025-09-02 18:19:28 83

1. 백트레이스 확인

(gdb) bt

(gdb) bt
#0  0x00007ffff78ac70e in ?? () from /lib64/libc.so.6
#1  0x00007ffff78ac72a in ?? () from /lib64/libc.so.6
#2  0x00007ffff791f03e in write () from /lib64/libc.so.6
#3  0x000055555555a0f9 in do_write (user_data=0x555555570d60) at server_dorothyrope.c:1028
#4  0x0000555555559172 in main (argc=1, argv=0x7fffffffdb68) at server_dorothyrope.c:714


2.1 해당 프레임으로 이동

어떤 frame을 봐야 하는가?
#0 ~ #2 : libc 내부 (write() 호출과 시그널 처리). → 보통은 C 라이브러리 내부라 코드 확인 불가.
#3 : 사용자 코드 do_write(), server_dorothyrope.c:1028 → 실제로 SIGPIPE가 발생한 write()를 호출한 위치.
#4 : main() 함수 시작 지점.

2.2 SIGPIPE 무시하고 계속 실행해보기

(gdb) handle SIGPIPE nostop noprint pass
(gdb) continue


3. frame 을 살펴보기

(gdb) frame 3
#3  0x000055555555a0f9 in do_write (user_data=0x555555570d60) at server_dorothyrope.c:1028
1028                    int ret = write(user_data->fd, user_data->write_buffer, user_data->write_size);
(gdb) list
1023
1024    int do_write(struct udata *user_data)
1025    {
1026            while (user_data->write_size > 0)
1027            {
1028                    int ret = write(user_data->fd, user_data->write_buffer, user_data->write_size);
1029
1030                    if (ret == user_data->write_size)
1031                    {
1032                            user_data->write_size = 0;

(gdb) info locals
ret = -939048020

댓글 0개

Previous / Next
Next 이미지 업로드 테스트입니다.