GDB 로 core dump 파일 분석 하기
프로 그래 밍 과정 에서 우 리 는 프로그램 을 컴 파일 할 수 있 지만 실행 할 때 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();
이상 은 코어 덤 프 의 간단 한 사용 입 니 다 ~ (오늘 면접 에서 질문 을 받 았 습 니 다 =. = 전에 안 써 봤 는데 못 맞 혔 습 니 다! 그래서 공부 하 러 왔 습 니 다 ~)
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
2020년 macOS에 Gdb Mac Setup Gdb 설치시스템에 gdb가 있으면 단계로 이동할 수 있습니다.오류가 발생하면 자체 제작 소프트웨어로 gdb를 설치해야 합니다. gdb를 설치하려면 다음 명령을 입력합니다. 다음 명령을 실행하여 gdb가 제대로 설치되었는지 확...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.