2016-06-06 17 views
6

Tôi sử dụng web.py để tạo một máy chủ web Python. Máy chủ này được gọi để giải quyết các vấn đề lập trình tuyến tính và nó sử dụng thư viện CBC để thực hiện điều đó.Máy chủ Python "Bị hủy bỏ (Cốt lõi)"

Mỗi một lần trong một thời gian, máy chủ bị treo với một khúc gỗ trông như thế:

78.243.184.3:56271 - - [03/Jun/2016 04:35:54] "HTTP/1.1 GET /optimization" - 200 OK 
Aborted (core dumped) 

I belive "Đã hủy bỏ (core dumped)" là một lỗi C, vì vậy nó xuất phát từ một trong hai web.py hoặc CBC.

Có cách nào để truy nguyên nguồn gốc của lỗi không?

+1

Có thể bạn có thể định vị tệp lõi. –

+0

Bạn có biết cách thực hiện điều đó không? – Arnaud

+0

Phụ thuộc vào hệ thống. Có thể là công cụ "find/-name" core "-ls'. –

Trả lời

4

Kết xuất lõi là do lỗi trong mã gốc trong máy chủ web của bạn. Python là khá darn rắn những ngày này, do đó, lỗi như vậy là hầu như luôn luôn gây ra bởi lỗi trong phần mở rộng C trong kinh nghiệm của tôi.

Do đó, bạn có 3 vấn đề.

  1. Bạn cần tìm tệp kết xuất lõi. Điều này thường nằm trong thư mục làm việc hiện tại của quá trình được bán phá giá. Tuy nhiên, có configation options that can change this.

  2. Bạn cần gỡ lỗi ngăn xếp cuộc gọi về những gì đã không thành công. Điều đó được đề cập trong StackOverflow - xem How to analyze a program's core dump file with gdb?

  3. Bạn có thể cần phải liên kết ngăn xếp trình thông dịch Python trở lại mã Python mà bạn đang chạy. Để làm điều này, bạn sẽ cần phải cài đặt các biểu tượng gỡ lỗi Python và các phần mở rộng Python cho gdb. Python wiki có lời khuyên tốt về cách làm điều đó here.

+0

Cảm ơn câu trả lời này, tôi sẽ kiểm tra gdb vào ngày mai. Tôi có một số câu hỏi xin vui lòng: 1. làm thế nào để bạn biết vấn đề đến từ máy chủ web và không CBC? 2. bạn có xác nhận rằng vấn đề xuất phát từ thư viện web.py và không phải từ mã của tôi không? 3. Tôi không tìm thấy bất kỳ tệp kết xuất lõi nào trong thư mục của server.py. Tôi có thể tìm các tùy chọn cấu hình của web.py ở đâu? 4. Làm thế nào để gỡ lỗi nó nếu nó nằm trong mã của web.py? 5. Bạn có nghĩ lựa chọn tốt nhất là thay đổi web.py cho một thư viện khác không? Cảm ơn bạn đã giúp đỡ! – Arnaud

+1

Tôi không thể cho bạn biết câu trả lời. Bạn có một bãi chứa lõi và chạy gdb trên đó sẽ cho bạn biết nơi mà các lỗi được. Đó là lý do tại sao các tệp lõi tồn tại - để phân tích bài đăng. Để nhận thêm trợ giúp từ bất kỳ ai, bạn cần trích xuất ngăn xếp cuộc gọi bằng các kỹ thuật tôi đã mô tả và cập nhật câu hỏi của bạn với nó. –

+0

Nhưng lỗi này xuất hiện một lần trong một thời gian (sau mỗi 2 hoặc 3 tuần), và tôi không thể tái tạo nó ... – Arnaud

0

Lý do phổ biến nhất cho bản đổ Lõi là truy cập địa chỉ bộ nhớ ngoài tầm với của bạn (bộ nhớ không thuộc chương trình của bạn). Các operatingsystem ngắt chương trình với một sự gián đoạn được gọi là SegFault hoặc BusError depeding về cách chương trình đã cố gắng truy cập vào địa chỉ bộ nhớ không hợp lệ. Chương trình sau đó sẽ bị đóng bởi nhân. Nếu hạt nhân đã được cấu hình để tạo ra một lõi-dump (một bãi chứa bộ nhớ và ngăn xếp của chương trình) một sẽ được lưu vào đĩa. Như đã lưu ý trong câu trả lời khác, bạn có thể tải lõi-dump vào GDB hoặc trình gỡ rối khác và hiển thị những gì chương trình đang làm tại thời điểm nó bị lỗi. Điều này có thể hoặc có thể không cung cấp cho bạn các vấn đề trong tầm tay. Bình thường, ngay cả đối với một lập trình viên có kinh nghiệm cũng sử dụng những công cụ này, vì vậy hãy lưu ý. Nếu bạn muốn thử sử dụng GDB, hãy thử này:

$ gdb/path/to/đâm/chương trình/nhị phân/path/to/lõi

(gdb) BT

'left' will hiển thị 'backtraces' nếu không được gọi là StackTraces và có thể hữu ích cho một lập trình viên để theo dõi lỗi.

Nếu bạn có thể tạo lại lỗi, có thể bạn đang may mắn gửi báo cáo chi tiết tới người tạo chương trình được đề cập. Ngay cả tôi với tư cách là một nhà phát triển phần mềm cao cấp cũng thường xuyên đi theo con đường đó. :-)

Các vấn đề liên quan