2012-02-09 1 views
4

valgrind를 사용하는 C++ 프로그램에서 메모리 누수를 추적하려고합니다. 이 프로그램은 g ++로 컴파일되며 오류를 발생시키지 않고 실행할 수 있습니다. 불행히도 valgrind는 런타임 오류를 던진 후 충돌하는 방식으로 내 프로그램의 동작을 변경합니다. 이 충돌은 코드의 관련 부분에 도달하기 전에 발생하므로 메모리 누수를 추적 할 기회가 없습니다.valgrind가 이진 동작을 변경 함

모든 문제는 첨부 된 콘솔 출력으로 설명됩니다.

[email protected]:~$ ./myProgram input.xml 

Processing... 

Finished successfully... 

---------------------- 
Hit Enter to continue... 

[email protected]:~$ valgrind --leak-check=yes --log-file=valgrindLog ./myProgram input.xml 

Processing... 
myProgram-error: Not working Polymorphism. Base class method called instead of derived class method. End-of-myProgram-error. 
terminate called after throwing an instance of 'char const*' 
Aborted 
[email protected]:~$ g++ -dumpversion 
4.4.5 
[email protected]:~$ valgrind --version 
valgrind-3.6.0.SVN-Debian 
[email protected]:~$ uname -r 
2.6.35-30-generic 
[email protected]:~$ cat /etc/*-release 
DISTRIB_ID=Ubuntu 
DISTRIB_RELEASE=10.10 
DISTRIB_CODENAME=maverick 
DISTRIB_DESCRIPTION="Ubuntu 10.10" 
+7

나는 valgrind가 프로그램의 동작을 변경하는 것을 의심하지만, 나는 단지 프로그램이 어떻게 든 UB를 전시한다고 생각하며 증상은 다릅니다. valgrind 로그에서 오류를 확인하는 데 귀찮았습니까? – PlasmaHH

+4

코드를 볼 필요가 있습니다. –

+1

글쎄, valgrind는 메모리 할당 함수를 후크하므로 실제로 프로그램 동작을 수정합니다. 그러나 프로그램은주의를 기울여서는 안되며,주의를 기울여야한다는 것은 valgrind가 전시 한 UB가 있음을 의미합니다. – sharptooth

답변

3

메모리 누수보다 심각한 버그가 있으므로 valgrind가 코드의 동작을 변경하는 것일 수 있습니다. 버그없는 이식 가능한 코드는 valgrind로 실행하기 때문에 예외를 throw하지 않을 것입니다.

0

저는 Valgrind가 모든 것을 망칠 때 이전에 결코 발생하지 않았던 스레드 경합 문제를 노출시키는 문제가있었습니다. 그 종류의 일이 여기서 일어날 수 있다고 생각하지 않습니까?

0

불행히도 valgrind는 내 프로그램의 동작을 런타임 오류가 발생한 후 충돌하는 방식으로 변경합니다. 이 충돌은 코드의 관련 부분에 도달하기 전에 발생하므로 메모리 누수를 추적 할 기회가 없습니다.

이것은 위대한 행운입니다. 이제 메모리 누수를 찾아 수정하는 것 외에도 버그를 찾아서 수정할 수도 있습니다. 핵심 파일을보고 코드의 오류 위치를 확인 했습니까?

0

여러분 모두에게 감사드립니다 !!!

valgrind가 밝혀낸 정의되지 않은 동작을 추적하기 위해 코드로 돌아 왔습니다. 마지막으로 나는 그것을 발견하고 그것에 의해 나의 코드를 향상시킬 수있다.

다시 한 번 감사드립니다.