2012-04-10 6 views
13

Tôi có một mã C++ phức tạp.Làm cách nào để gỡ lỗi 'Phát hiện ngăn xếp ngăn xếp'?

Đó là một chương trình FastCGI, sử dụng http://althenia.net/fcgicc

Khi tôi hỏi nó cho một url looooong, tôi nhận được

*** stack smashing detected ***: ./tileserve terminated 
Erreur de segmentation 

Đối với cuộc sống thực, nó không phải là một vấn đề vì tôi không bao giờ sử dụng url rất lâu, nhưng nó có nghĩa là bất cứ ai có thể chấm dứt máy chủ của tôi .... Tôi không thích điều đó.

Có công cụ nào (và cách sử dụng công cụ này không?) Để tìm ra sự cố xuất hiện ở đâu?

CHỈNH SỬA: SOLVED

Ok đã giải quyết xong.

tôi đang làm

int len; 
char uri[200]; 

len = strlen(request.params[std::string("REQUEST_URI")].c_str()); 
printf("%d\n", len); 

if (len > 200) return 1; 

strcpy(uri, request.params[std::string("REQUEST_URI")].c_str()); 

Hình như đó 200 là quá Hight cho kỳ thi len. Nó thực sự thất bại tại 194.

Vì vậy, tôi đã làm:

if (len > 190) return 1; 

Bây giờ, nó là tốt.

+2

Theo dõi ngăn xếp có thể cung cấp cho bạn gợi ý. – Mahesh

+4

+1 cho 'Erreur de segmentation' – trojanfoe

+0

Dấu vết ngăn xếp là gì? – user1219721

Trả lời

14

Nếu bạn đọc trang web, bạn sẽ nhận ra rằng đây là trình bao bọc C++ đơn giản trên thư viện C.

Một vấn đề điển hình với thư viện C là vượt đệm:

#include <cstring> 
#include <cstdio> 

int main(int argc, char* argv[]) { 
    char buffer[16]; // ought to be sufficient 

    strcpy(buffer, argv[1]); 
    printf("%s", buffer); 
} 

Hãy thử chương trình này:

> ./test "a" 
a 
> ./test "abcdefghijklmnoprqstuvwxyz" 
??? 

Bởi vì bộ đệm chỉ có thể chứa 16 ký tự, các nhân vật còn lại sẽ được ghi qua kết thúc . Đây là ngăn xếp đậphành vi không xác định.

Một số triển khai của thư viện thời gian chạy hoặc hệ điều hành của bạn có thể phát hiện tình trạng này trong một số điều kiện và chấm dứt chương trình.

Hoặc bạn đang làm điều gì đó sai hoặc thư viện là.

Để tìm sự cố, bạn có thể sử dụng Valgrind hoặc chạy chương trình của bạn trong trình gỡ lỗi. Ngoài ra, nếu hệ thống của bạn cho phép nó, bạn có thể có một bãi chứa bộ nhớ tại thời điểm chương trình đã bị giết. Bạn cũng có thể xem kết xuất bộ nhớ này trong trình gỡ lỗi.

+0

Vâng, tôi hiểu vấn đề là gì. Vấn đề là xác định vị trí của nó ... – user1219721

+0

@ user1219721: oups xin lỗi, đã bỏ lỡ phần đó. Sử dụng trình gỡ rối (được tích hợp trong VC++ hoặc gdb trên Linux). –

+0

Valgrind là vô dụng ở đây, vì nó không phát hiện lỗi bộ nhớ dựa trên ngăn xếp - chỉ heap bộ nhớ tham nhũng. –

0

Bạn có thể sử dụng một cái gì đó như valgrind, hoặc trình biên dịch của bạn có thể có phân tích tĩnh có thể tìm thấy những nơi bạn có thể là bộ đệm quá mức. Ngoài ra bạn chỉ có thể kiểm tra mã của bạn để sử dụng các chức năng dễ bị lỗi như strcpy và thay thế chúng bằng các chức năng an toàn như strncpy, hoặc tốt hơn nhưng chỉ sử dụng các đối tượng quản lý bộ nhớ của riêng chúng như std :: string.