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 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Microbit용 CMSIS-RTOS 구축qemu에서 마이크로비트를 이동해서 구축한 입니다. arm-none-eabi-gcc qemu 다음 2개를 활용하면 구축이 가능합니다. 위 코드를 활용해 구축할 수 있지만 추가_start 이후 처리도 가능하다. 의 아...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.