2012-09-05 3 views
1

콜백 함수를 임의로 호출하는 동안 세그먼트 화 오류로 프로그램이 중단됩니다. 코어를 분석 할 때 콜백 함수 주소는 0x20202020입니다. 프로그램이 신호 11, 세그먼트 오류로 종료되었습니다.콜백 함수를 호출하는 중 세그먼트 오류로 인해 프로그램이 중단됨

#0 0x20202020 in ??() 

(gdb) bt 

#0 0x20202020 in ??() 
#1 0xf775a8cf in my_function (parm_p=0x9b88020) at ../src/mewz.c:1395 

(mqheader_p->mqh_callback)(mqheader_p->mqh_cbarg); 

mqh_callback = 0x20202020, 
mqh_cbarg = 0x20202020, 

이것은 무작위로 발생합니다. 0x20202020은 콜백 함수의 유효한 주소가 아니라이 콜백 함수 주소가 무작위로 잘못된 주소를 가리키는 이유를 알고 있습니다. 모든 단서?

+0

이 질문에 프로그램을 쓰는 언어로이 질문을 붙이십시오. – chucksmash

+0

mqheader_p 변수가 초기화되지 않았거나 일부 stringpointer 값으로 덮어 썼습니다. – wildplasser

+0

코드는 "C"언어로 작성되었습니다. (mqheader_p-> mqh_callback)은 콜백 함수 포인터입니다. –

답변

2

콜백 함수 포인터가 제대로 덮어 쓰여 졌거나 제대로 할당되고 초기화되지 않은 메모리에서 사용되고 있습니다.

0x20이 공백 문자의 ASCII 코드라는 점이 다소 흥미 롭습니다.

것이다 것 :

  1. mqheader_p 지점에서 데이터의 할당 주위의 코드를 검사합니다.
  2. 디버거에서 프로그램을 실행하고 함수 포인터에 감시 점을 설정하십시오.
2

제 추측은 버퍼 오버런입니다. 0x20은 ASCII 공간이기 때문에 주소를 덮어 쓰는 문자열의 일부라고 생각합니다. 특정 sprintf 등의 사용을보십시오.

문자열을 덮어 쓸 수있는 단서를 제공하기 전과 후에 메모리를 로그 할 수 있습니다.

NB : 0x20202020은 4 바이트 0x20 0x20 0x20 0x20 또는 연속 4 개의 공백 문자입니다.

+0

정확하게 0x20이 아니며 0x20202020 –

+0

입니다. 이전 코어 파일에서 값은 0x57입니다. –

+0

포인터로 한 번에 4 바이트를보고 있으므로 한 줄에 4 칸이 표시됩니다. 0x57은 'W'문자이며 [ASCII 표] (http://www.asciitable.com/)를 참조하십시오. – weston

0

이러한 종류의 버그를 일으키기 위해서는 mqh_callback을 처음 초기화 한 후에 mqh_callback 값을 인쇄하고 콜백을 호출하기 전에 다른 인쇄물을 출력해야한다고 생각합니다. Aonther는 mqh_callback의 주소에 쓰기 중단 점을 사용합니다.

이런 종류의 오류는 initilization 누락, 버퍼 오버 플로우 등과 같은 일부 포인터 트릭 조작에서 발생할 수 있습니다.

+0

안녕하세요 wbao, 답장을 보내 주셔서 감사합니다. 콜백을 지정하거나 호출하기 전에 해당 값을 인쇄 해 보았습니다. 시간의 hunderds 들어, 두 값이 동일합니다. 그러나 콜백 함수가 호출되기 전의 특정 시점에서이 값은 0x20202020이되었습니다. 그리고 이것은 스레드 시작 함수 내에 있습니다. –

+0

귀하의 env 지원 여부가 확실하지 않습니다. GDB에는 특정 virutal 주소에 대한 쓰기 메모리 액세스를 볼 수있는 awatch 명령이 있습니다. "악마"를 추적하는 방법은 어떨까요? 이것은 누가 당신의 기능 포인터를 변경하는 쉬운 방법 일 수 있습니다 – wbao

+0

안녕 Wbao,이 문제는 클라이언트 환경에서 발생합니다. 그리고 또 하나 흥미로운 점은 충돌이 일어나지 않는 열등한 클라이언트 설치가 있다는 것입니다. 한 고객에 대해서만 무작위로 충돌합니다. –

관련 문제