GDB 로 core dump 파일 분석 하기

5862 단어 gdb디 버 깅core
머리말
프로 그래 밍 과정 에서 우 리 는 프로그램 을 컴 파일 할 수 있 지만 실행 할 때 Segment fault (단락 오류) 가 자주 발생 할 수 있 습 니 다.세그먼트 오류 가 발생 한 것 은 잘못된 메모리 세그먼트 에 접근 한 것 입 니 다.세그먼트 오류 가 발생 했 을 때 컴 파일 오류 처럼 파일 의 한 줄 에 알려 주지 않 고 정보 가 없 기 때문에 디 버 깅 이 어렵 습 니 다. 특히 코드 양 이 많 을 때 한 단계 디 버 깅 이 번 거 롭 습 니 다.이 시간 에 잘못 저장 한 코어 파일 이 도움 이 되 었 다.
배치 하 다.
시스템 이 신호 중단 으로 인 한 오류 가 발생 할 때 core 파일 을 만 들 려 면 셸 에서 다음 과 같은 설정 을 눌 러 야 합 니 다.
#  core     
ulimit -c unlimited
#         
ulimit unlimited

이상 설정 은 이번 만 유효 합 니 다. 다음 에 다시 시작 하려 면 다시 설정 해 야 합 니 다.
다음은/etc/sysctl. conf 파일 을 수정 하여 생 성 된 core 파일 을 설정 합 니 다.
파일 끝 에 다음 줄 추가
kernel.core_pattern=/tmp/core-%e

kernel. core 수정uses_pid = 1 은 kernel. coreuses_pid = 0 과 같은 core 파일 의 형식 은 core - 실행 가능 한 파일 의 이름 입 니 다. 여기 서 프로 세 스 번 호 를 지 웠 습 니 다. 프로 세 스 번호 가 여기 서 별로 쓸모 가 없다 고 생각 합 니 다.파일 이 있 는 디 렉 터 리 는/tmp 아래 에서 도 실행 가능 한 파일 이 있 는 디 렉 터 리 로 스스로 수정 할 수 있어 직관 적 입 니 다.
그리고 명령 실행:
sysctl -p /etc/sysctl.conf

값 을 '/home/duanbei/corefile/core -% e -% p -% t' 로 변경 하면 모든 core 파일 은 '/home/duanbei/corefile' 디 렉 터 리 에 저 장 됩 니 다. 파일 이름 형식 은 'core - 프로그램 이름 - pid - 타임 스탬프' 입 니 다.
코어 덤 프 생 성
다음은 코어 파일 의 사용 을 예 로 들 어 설명 하 겠 습 니 다.
먼저 잘못된 코드 를 만 듭 니 다:
#include<iostream>
using namespace std;

void dummy_function()
{
    unsigned char* ptr = 0x00; //      0x00
    *ptr = 0x00;
}

int main()
{
    dummy_function();
    return 0;
}

컴 파일 실행 중 coredump 생 성:
$ g++ -g -o test test.cpp
$ ./test 
    (     )

코어 덤 프 보기
core dump 가 발생 한 후, gdb 로 core 파일 의 내용 을 볼 수 있 으 며, 파일 에서 core dump 를 일 으 키 는 줄 을 찾 을 수 있 습 니 다. 그 형식 은 다음 과 같 습 니 다.
gdb [exec file] [core file]

예:
gdb ./test test.core

gdb 에 들 어간 후, bt 명령 으로 backtrace 를 확인 하여 프로그램 이 어디로 실행 되 는 지 확인 하고, core dump 의 파일 -> 줄 을 찾 습 니 다.
$ gdb ./test core
GNU gdb (Ubuntu 7.7.1-0ubuntu5~14.04.2) 7.7.1
Copyright (C) 2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i686-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from ./test...done.
[New LWP 3621]
Core was generated by `./test'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0  0x0804858d in dummy_function () at test.cpp:14
14      *ptr = 0x00;

위 에 코어 덤 프 가 표 시 된 곳.
(gdb) bt //        ,   main    dummy_function  
#0 0x0804858d in dummy_function () at test.cpp:14
#1 0x0804859a in main () at test.cpp:19
(gdb) f 1 //     1   ,  main       dummy_function  ,f    frame
#1 0x0804859a in main () at test.cpp:19
19      dummy_function();

이상 은 코어 덤 프 의 간단 한 사용 입 니 다 ~ (오늘 면접 에서 질문 을 받 았 습 니 다 =. = 전에 안 써 봤 는데 못 맞 혔 습 니 다! 그래서 공부 하 러 왔 습 니 다 ~)

좋은 웹페이지 즐겨찾기