2014-08-29 3 views
1

dmalloc 버전 5.5.2 및 glibc 2.17을 사용하려고합니다.dmalloc의 vsnprintf 가정에 대한 표준 해결책이 있습니까?

dmalloc에서 링크하면 항상 segfault가 발생합니다.

디버깅, 유용한 디버깅 메시지를 형식화하려고 할 때 dmalloc이 vsnprintf (...)를 호출 함을 발견했습니다. 불행히도 vsnprintf (..) 자체는 free()를 호출하므로 분할 오류의 원인은 재귀입니다. 거대한 스택 추적으로 segfault 할 때까지 free()는 vsnprintf()를 호출하고 vsnprintf()는 free() 등을 호출합니다.

HAVE_VSNPRINTF 및 HAVE_VPRINTF를 정의 해제하여이 문제를 신속하게 해결할 수 있지만 디버깅 메시지에는 주요 정보가 누락됩니다.

메모리를 할당하지 않는 vsnprintf (...)의 고대 구현을 사용하여이 문제에 대한 내 자신의 해킹을 해킹했지만 이미 좋은 해결책이 없다고 생각하기는 어렵습니다.

dmalloc을 사용하여이 문제를 해결하는 표준 방법이 있습니까? 당신이 잘못된 호출이 null 인수와 쓸모없는 하나입니다 것으로 나타났습니다 때문에

+0

'vsnprintf'가'free'를 호출한다는 이상한 것처럼 보입니다 ... 왜 그런지/어디에서 그 일을하는지 알아낼 수 있습니까? – nneonneo

+0

콜 스택에서 vsnprintf는 실제로 free를 호출하는 vprintf를 호출합니다. 또한 두 번째 free의 주소는 NULL입니다. 이것은 libc의 버그처럼 보입니다. – user3200145

+1

버그가 아니기 때문에 ('free (0)'원하는대로 호출 할 수 있으므로'vsnprintf는 완전히 권한이 있음) 불필요한 것이 여러분의 인생을 어렵게 만듭니다. –

답변

2

, 가장 간단한 해결 방법은 dmallocfree의 시작 부분에 if (!p) return;를 추가 할 것으로 보인다.

+0

단순히 "if (pnt == NULL) return (FREE_NOERROR);"을 추가하십시오. dmalloc_free의 맨 위에는 문제가 수정되었습니다. – user3200145

관련 문제