본문 바로가기
Python

[debugging] core dump error

by 두뇌향상중 2023. 11. 8.
반응형

1. 환경

사용 운영체제: Rocky LINUX 8

개발 언어: Python 3.9

 

miniconda에 별도의 환경을 구성하여 Python 3.9 설치

GUI는 개발 과정 중의 손쉬운 수정을 위해 PySide6를 사용하여 작성

하드웨어와 연결하는 소프트웨어를 제외하고 나머지 소프트웨어들은 메시지 통신

메시지 통신은 RabbitMQ Server를 사용

 

2. 사용자 화면 내의 주요 기능

하드웨어 상태 모니터링

촬영 화면 뷰어

뷰어 상의 마우스 클릭 이후 계산 과정

하드웨어로부터 이미지 얻어오는 반복 기능

리스트뷰(QPlainTextEdit)에 로그 보여주기

 

3. 반복 기능 구현

메시지 통신을 위해 queue를 감시하는 Thread 여러 개

ProgressBar 동작을 위한 QTimer 두 개

 

4. 에러 메시지

Object: Cannot create children for a parent that is in a different thread.

 

Segmentation fault (core dumped)

 

core dump 메시지가 뜨면 해당 소프트웨어는 즉사 !!!

 

구글링과 ChatGPT과의 대화를 통해 알게 된 사실은, 

core dump와 관련된 에러 메시지는 C언어의 메모리 관리가 안 될 경우 발생한다고...

때로는 malloc함수 어쩌고 하면서 메시지가 뜨기도..., 이건 C언어에서 보던 함수인데 !!!

 

5. 해결

원인은 QPlainTextEdit로 선언된 변수가 리셋될 시점에, 

내가 만들지 않은 thread가 동작하는데,

이 thread는 main thread에 속하지 않은 별도의 Qt 라이브러리 내부에서 생성되는 것으로 추측.

 

폭풍 구글링을 통해, QPlainTextEdit에서 memory leak 문제 발생에 대한 여러 기록들 발견.

죽는 시점이 매번 달라서, 더욱 찾기 어려웠다.

 

문제를 알고 보니, 모든 로그를 저장하기 전에 리스트에 뿌렸고, 

어떤 로그는 thread 안에서 생성되기도 하고, 어떤 로그는 thread 밖에서 생성되기도 했기 때문에,

thread 소속이 다르다고 하는 메시지는 thread 안에서 생성될 때 발생한 에러 메시지였다.

 

QPlainTextEdit를 QListWidget으로 수정.

QListWidget으로 선언한 변수는 리셋 시점을 내가 수동으로 지정할 수 있고,

테스트 결과 내부에서 생성되는 thread가 동작하지 않음!

 

 

6. 고찰

Qt 라이브러리는 QtDesigner를 통해 편집 및 변수 선언 등도 편리하고,

코드도 자동으로 만들어주지만...

때로는 나도 모르는 블랙 박스 라이브러리들 때문에 골탕을 먹기도 한다는 걸...

 

비록 시뮬레이션이지만 가급적 실제와 가깝게 환경을 만들고 테스트를 많이 해 봐야겠다.

 

반응형

댓글