2012-01-25 15 views
7

Tôi có rất lạ vấn đề và vì tôi không thể gửi mã, tôi sẽ cố gắng giải thích.Làm thế nào để thay đổi nhỏ trong mã không bao giờ được thực hiện tạo nên sự khác biệt?

Điều này giống như vấn đề triết học - Tôi hy vọng ai đó có thời gian/kiến ​​thức để suy nghĩ về điều này.

1) Tôi đã project.cpp tìm kiếm chính xác như thế này:

#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 tìm kiếm một cái gì đó như thế này:

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

3) not_executed _from_main.cpp tìm kiếm một cái gì đó như thế này:

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

Đây là tất cả linke d cùng với nhiều thư viện khác và tấn rác, nhưng điều này về cơ bản là điều quan trọng.

->Vấn đề:

Khi tôi chạy này, tôi sẽ thấy cửa sổ chơi movie clip sử dụng GStreamer trong 5 giây ->NHƯNG tôi chỉ nghe được âm thanh!

->Lạ một điều:

Khi tôi nhận xét dòng:

myObj = MyClass::createNew(args); 

và chạy lại -> Tôi thấy cửa sổ GStreamer cũng (mọi thứ đều tốt)

->Ghi chú:

điều này có thể có thứ gì đó để làm với:

  • quá trình liên kếtchất của MyClass và đó là tầng lớp phụ huynh (đoán tốt nhất của tôi)
  • "tĩnh" từ khóa
  • "bên ngoài" từ khóa
  • C và C++ trộn

->Tôi hỏi một lần nữa:

Làm cách nào để thay đổi nhỏ trong mã không bao giờ được thực thi tạo nên sự khác biệt?

(xin giúp)

+1

Các vấn đề về bộ nhớ có thể xảy ra, hãy kiểm tra với valgrind – academicRobot

+1

Thử chạy chương trình dưới valgrind và xem liệu có bất kỳ ngăn xếp ngăn xếp/rò rỉ bộ nhớ nào/giải phóng đôi/. – orlp

+0

Không có sự khác biệt. Nhưng có vẻ như 'not_executed_from_main.cpp' của bạn đang tạo ra sự khác biệt mà bạn không biết. Có thể cho chúng tôi biết thêm về tệp .cpp và .h này không? –

Trả lời

3

lẽ Hầu hết nó đã làm với stackoverflow. Bạn có một cái gì đó mà làm một số điều xấu, giải quyết những điều ngoài ranh giới hoặc một số hành vi không xác định khác và điều này chỉ gây nên (hoặc không) chỉ trong một số cấu hình cụ thể. Thêm hoặc xóa một khai báo biến có thể là một điều như vậy.

+0

+1 Thêm mã đó vào mã nhị phân sẽ thay đổi mã đang bị ngăn xếp bởi luồng ngăn xếp. Tôi đã nghĩ rằng mã đã được bảo vệ khỏi dữ liệu tràn vào nó nhưng tôi nghi ngờ đó là 100%. – John

7

Có vẻ như bạn cần làm quen với chaos theory. Trong một hệ thống đủ phức tạp, sự thay đổi nhỏ nhất có thể lan truyền thông qua bất kỳ sự bất ổn cố hữu nào đến mức gây ra sự khác biệt lớn.

Trong trường hợp của bạn, nó có thể là bất cứ điều gì từ các tác dụng phụ ngầm định của phương pháp đó, đến lỗi liên quan đến bộ nhớ hiển thị khi bố cục của mã thực thi thay đổi.

Bạn nên sử dụng trình gỡ lỗi để theo dõi mã của mình. Hãy chắc chắn rằng không có gì từ mã được cho là không thực thi được thực thi. Mã của bạn có thể đang nhập các đường dẫn mã mà bạn nghĩ nhầm là không thể truy cập được hoặc một số phần khác của chương trình của bạn (ví dụ: trình khởi động tĩnh) có thể hoạt động.

Valgrind cũng có thể hữu ích nếu nó có sẵn cho nền tảng của bạn - nó sẽ phát hiện vô số các lỗi liên quan đến bộ nhớ, giống như lỗi tôi nghi ngờ bạn có trong tay. Thật không may, nó không phải là rất tốt tại phát hiện lỗi trong ngăn xếp - trình biên dịch của bạn có thể có thể giúp đỡ ở đó, mặc dù.

+0

Nhạy cảm với điều kiện ban đầu, tuyệt vời! – academicRobot

2

cho mã ví dụ của bạn không phải là mã thực sự với những vấn đề ....

chính không phải là điểm mấu chốt duy nhất mà mã có thể bắt đầu thực hiện, bất kỳ đối tượng toàn cầu sẽ thực hiện nhà thầu của họ mà có thể kích hoạt tắt tất cả các loại của mã. Vì vậy, có lẽ đó là một số cách cắn bạn.

Hoặc gỡ lỗi hoặc, có thể, đưa thư ra bàn điều khiển để xem đường dẫn nào đang thực thi.

+0

Vâng, tôi đã kiểm tra điều đó (có lẽ không tốt như tôi nên) nhưng tôi chắc chắn rằng mã * không bao giờ * được đưa vào dòng này, vì vậy ngay cả khi chương trình nhập vào một số nhà xây dựng (và nó!), Tôi vẫn không ' t có được điều này ... – kliketa

+0

có thể có tất cả các loại điều kỳ lạ xảy ra nếu bạn có vấn đề liên kết lạ, vấn đề bộ nhớ, v.v. Không vui khi tìm .... ngay bây giờ nếu dòng mã đó không được thực hiện, nó có thể là một vấn đề về bộ nhớ, hãy thử đặt một hàm gọi khác vào đó để có thể có một thứ khác. –

0

Chủ đề của bạn có sử dụng myObj không? Nếu vậy có thể có một điều kiện chủng tộc giữa việc thiết lập myObj thành NULL và phân bổ lại nó.

+0

xin lỗi, nó không – kliketa