programing

디버거를 사용하지 않는 경우에만 segfault가 발생합니다.

randomtip 2022. 8. 10. 21:00
반응형

디버거를 사용하지 않는 경우에만 segfault가 발생합니다.

멀티스레드 C 프로그램이 있으며, 이 프로그램은 프로그램의 특정 지점에서 분할 오류를 지속적으로 생성합니다.gdb로 실행해도 장애는 표시되지 않습니다.디버거를 사용하지 않을 때만 장애가 발생할 수 있는 이유를 생각할 수 있습니까?문제를 찾기 위해 사용할 수 없다는 것은 매우 짜증나는 일입니다!

전형적인 하이젠버그.Wikipedia에서:

하이젠버그에는 시간 또한 요인이 될 수 있다.디버거의 제어 하에 프로그램을 실행하면 프로그램의 실행 타이밍이 통상적인 실행과 비교하여 변경될 수 있다.레이스 조건과 같은 시간에 민감한 버그는 디버거의 싱글 스텝 소스 라인에 의해 프로그램이 느려지는 경우 재현되지 않을 수 있습니다.이것은, 2대의 머신간에 네트워크 패킷 처리를 디버깅 해, 1대의 머신만이 디버깅 하고 있는 경우 등, 디버거의 제어하에 있지 않은 엔티티와의 상호작용을 수반하는 동작에 특히 해당합니다.

디버거가 타이밍을 변경하여 레이스 조건을 숨기고 있을 수 있습니다.

Linux 에서는, GDB 는 주소 공간의 랜덤화를 디세블로 합니다.크래시는 주소 공간의 레이아웃에 고유한 경우가 있습니다.해라(gdb) set disable-randomization off.

마침내.ulimit -c unlimited사후 디버깅(Robie가 이미 제안)이 기능하는 경우가 있습니다.

아마 사용할 때gdb메모리는 오버플로우/언더플로우가 크래시의 원인이 되는 메모리를 짓밟지 않는 위치에 매핑됩니다.아니면 더 이상 걸려들지 않는 경주 조건일 수도 있다.비록 의도적이지 않게 들리겠지만, 당신은 당신의 프로그램이 당신에게 충돌할 만큼 충분히 좋았다는 것을 기뻐해야 합니다.

몇 가지 제안

  1. 무료 cppcheck와 같은 정적 코드 분석기를 사용해 보십시오.
  2. libeence와 같은 malloc() 디버거를 사용해 보십시오.
  3. 발그린드를 통해 실행해 보십시오.

사용하시는 경우gcc, 를 사용해 주세요.-Wall옵션을 선택하면 모든 경고가 표시됩니다.Eclipse와 같은 IDE를 사용하면 자동으로 그렇게 됩니다.

디버깅을 하면 실행 중인 환경이 변경됩니다.일종의 레이스 상황에 대처하고 있는 것처럼 들립니다.디버깅을 하면 일정도 약간 달라지기 때문에 문제가 발생하지 않습니다.또는 사물이 약간 다른 방식으로 저장되기 때문에 발생하지 않습니다.문제 해결에 도움이 되는 디버깅 출력을 코드에 넣을 수 있습니까?그러면 영향이 적고 문제를 찾을 수 있습니다.

전에도 이런 문제가 있었어!레이스 조건이었고 디버거를 사용하여 코드를 검색할 때 스레드가 레이스 조건을 트리거하지 않을 정도로 느렸습니다.꽤 끔찍해.

언급URL : https://stackoverflow.com/questions/4628521/segfault-only-when-not-using-debugger

반응형