2012-01-25 2 views
7

나는 이 매우 이상하다. 문제가 있으며 코드를 전송할 수 없으므로 설명하려고 노력할 것이다.절대로 실행되지 않는 코드의 작은 변화가 어떻게 달라질 수 있습니까?

이것은 더 철학적 인 문제와 비슷합니다. 누군가가 이것을 생각할 시간/지식이 있기를 바랍니다.

1) 나는 project.cpp과 같이 정확하게 찾고있다 :

#include <pthread.h> 
#include <unistd.h> 
pthread_t pplayer_thread; 
void *play(void*); 

int main(int argc, char **argv) { 
    pthread_create(&pplayer_thread, NULL, play_cb, NULL); 
    usleep(5000000); 
    return 0; 
} 
이 같은

2) pplayer.cpp보고 뭔가 : _from_main.cpp 뭔가를 찾고 not_executed

... 
void *play_cb(void *arg) { 
    // this starts movie using gstreamer and exits thread 
} 
... 

3) like :

... 
extern MyClass *myObj; // this is included from .h file 
... 
MyClass *myObj = NULL; 
... 
some_function() { 
    ... 
    myObj = MyClass::createNew(args); 
    ... 
} 
... 

이것은 모두 linke입니다. 여러 가지 다른 도서관과 쓰레기 톤과 함께,하지만 이것은 기본적으로 중요한 것입니다.

->문제 :

내가 이것을 실행하면, 나는 창 5 초 동안 gstreamer를을 사용하여 동영상 재생 볼 수 ->하지만 난 단지 소리를들을!

->이상한 일이 : 나는 줄 언급 할 때

는 :

myObj = MyClass::createNew(args); 

및 다시 실행을 -> 나는 또한 gstreamer를 창이 표시 (모든 것이 괜찮습니다)

->참고 :

이것은 뭔가있을 수 있습니다. 함께 할 수있는 :

  • 연결 과정 및 MyClass에의 성격과 혼합 부모 클래스 (내 추측)
  • "정적"키워드
  • "외부"키워드
  • C 및 C++의

은 ->나는 한 번 더 물어 :

결코 실행되지 않는 코드의 작은 변화가 어떻게 달라질 수 있습니까?

(도와주세요)

+1

예상되는 메모리 문제, valgrind로 확인 – academicRobot

+1

valgrind에서 프로그램을 실행하고 stackoverflows/memory leaks/double frees/가 있는지 확인하십시오. – orlp

+0

차이가 없어야합니다. 그러나 당신의'not_executed_from_main.cpp'가 당신이 알지 못하는 차이를 만들고있는 것 같습니다. 이 .cpp 및 .h 파일을 더 많이 보여줄 수 있습니까? –

답변

3

대부분의 아마에 유래과 관련이있다. 당신은 뭔가 나쁜 것을하거나, 경계를 넘어서거나, 정의되지 않은 다른 행동을 취하는 무언가를 가지고 있으며, 이는 단지 몇몇 특정 구성에서만 트리거됩니다 (또는 그렇지 않습니다). 변수 선언을 추가하거나 삭제하는 것은 그렇게 할 수 있습니다.

+0

+1 그 코드를 바이너리에 추가하면 스택 오버 플로우에 걸리는 코드가 이동합니다. 나는 코드가 넘쳐나는 데이터로부터 보호되었다고 생각했지만, 그것이 100 %라고 의심한다. – John

7

chaos theory에 익숙해 져 있어야합니다. 충분히 복잡한 시스템에서, 사소한 변화는 고유 한 불안정성을 통해 큰 차이를 일으키는 지점까지 전파 될 수 있습니다.

귀하의 경우에는 해당 메소드의 암시 적 부작용에서부터 실행 가능 코드의 레이아웃이 변경 될 때 표시되는 메모리 관련 오류에 이르기까지 다양 할 수 있습니다.

코드를 추적하려면 디버거를 사용해야합니다. 실제로 실행되지 않은 코드의 어떤 것도 실제로 실행되지 않았는지 확인하십시오. 코드에서 실수로 액세스 할 수 없다고 생각하는 코드 경로 나 프로그램의 다른 부분 (예 : 정적 초기화 도구)이 작동 중일 수 있습니다.

Valgrind 또한 플랫폼에 사용할 수있는 경우 유용 할 수 있습니다. 사용자의 손에 갖고있는 것 같은 여러 가지 메모리 관련 오류를 감지합니다. 불행히도 스택의 오류를 감지하는 것은 그리 좋지 않습니다. 컴파일러가 도움을 줄 수는 있습니다.

+0

초기 조건에 대한 민감도, 우수함! – academicRobot

2

주요

코드는 모든 종류의를 트리거 할 수있는 자신의 생성자를 실행, 전역 객체를 실행을 시작할 수있는 유일한 진입 점없는 .... 당신의 예제 코드는 문제와 실제 코드가 아닙니다 제공 코드 그래서 아마도 당신을 물어 뜯는 몇 가지가 있습니다.

디버깅하거나 콘솔에 메시지를 출력하여 어떤 경로가 실행 중인지 확인하십시오.

+0

그래, 나도 확인했다. (아마도 내가 할만 큼 좋지는 않을 것이다.) 그러나 코드가 결코이 줄에 오지 않는다고 확신한다. 그래서 프로그램이 몇몇 생성자에 들어가더라도 (여전히 그렇다) 이걸 받아들이면 ... – kliketa

+0

이상한 일들이 생기면 괴상한 연결 문제, 메모리 문제 등등이 생길 수 있습니다. 찾기가 쉽지 않습니다. 코드 줄이 실행되지 않는다면, 그 가능성이있는 메모리 문제, 뭔가 다른 것에 아마도 다른 함수 호출을 시도하십시오. –

0

myObj를 사용하여 스레드가 있습니까? 그렇다면 myObj를 NULL로 설정하고 다시 할당하는 사이에 경쟁 조건이있을 수 있습니다.

+0

죄송합니다. – kliketa

관련 문제