2016-01-21 21 views
11

Gần đây khi thêm các trình gỡ lỗi mã python 2.7.10 của tôi, tôi nhận được tin nhắn này:Bdbquit tăng khi gỡ lỗi python

Traceback (most recent call last): 
    File "/Users/isaachess/Programming/vivint/Platform/MessageProcessing/vivint_cloud/queues/connectors/amqplib_connector.py", line 191, in acking_callback 
    callback(message.body) 
    File "/Users/isaachess/Programming/vivint/Platform/MessageProcessing/vivint_cloud/queues/consumable_message_queue.py", line 32, in deserialized_callback 
    self._callback_method(msg) 
    File "/Users/isaachess/Programming/vivint/Platform/BusinessLogic/businesslogic/util/statsd_util.py", line 95, in _time_func 
    retVal = f(*args, **kwargs) 
    File "/Users/isaachess/Programming/vivint/Platform/MessageProcessing/vivint_cloud/net/router.py", line 226, in handle 
    try: 
    File "/Users/isaachess/Programming/vivint/Platform/MessageProcessing/vivint_cloud/net/router.py", line 226, in handle 
    try: 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/bdb.py", line 49, in trace_dispatch 
    return self.dispatch_line(frame) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/bdb.py", line 68, in dispatch_line 
    if self.quitting: raise BdbQuit 
BdbQuit 

Đây là sau khi chèn các dòng:

import pdb; pdb.set_trace()

trong mật mã.

Tôi không thể hiểu tại sao điều này xảy ra. Tôi đã đọc trên Bdb và Bdbquit, nhưng không thể hiểu tại sao điều này xảy ra trong mã của tôi. Bất cứ ai có thể cung cấp cho tôi một số gợi ý về lý do tại sao điều này xảy ra nói chung? Tôi thực sự muốn yêu cầu trình gỡ lỗi hoạt động trở lại.

+3

Bạn chạy quy trình của mình bằng cách nào? Tôi đoán là quá trình của bạn không gắn liền với một thiết bị đầu cuối hoặc một cái gì đó như thế. Đây có phải là một tiến trình con hoặc một cái gì đó như thế không? – shx2

+0

@ shx2, subprocess? Có thể bằng cách nào đó việc sử dụng [Luigi] (https://pypi.python.org/pypi/luigi) gây ra điều này? –

Trả lời

6

Nếu bạn tiếp tục từ lời nhắc (pdb) và cho phép mã của bạn kết thúc bình thường, tôi sẽ không mong đợi kết xuất như lần truy nguyên bạn chỉ định, nhưng nếu bạn thoát pdb, với lệnh quit hoặc^D (EOF), traceback như vậy xảy ra bởi vì không có gì để bắt được ngoại lệ BdbQuit được nêu ra khi trình gỡ rối thoát. Trong bdb.pyself.quitting được đặt thành True theo phương pháp set_quit (và bởi finally mệnh đề trong các phương pháp chạy khác nhau). Các phương thức công văn được gọi là trace_dispatchraise BdbQuit khi self.quittingTrue và mệnh đề except: điển hình cho BdbQuit là một tuyên bố đơn giản pass; pdb kế thừa tất cả số đó từ gdb.

Trong ngắn hạn, xử lý ngoại lệ được sử dụng để vô hiệu hóa chức năng theo dõi hệ thống được trình gỡ lỗi sử dụng, khi tương tác trình gỡ lỗi kết thúc sớm.

Một cách để tránh sự truy nguyên đó hoàn toàn là sử dụng pdb khác nhau. Thay vì gọi số pdb.set_trace() từ mã của bạn (và không xử lý tất cả BdbQuit), bạn có thể gọi mã của mình trong phạm vi pdb (thay vì ngược lại), tại thời điểm đó, ngoại lệ BdbQuit sẽ được xử lý như dự định bởi pdb. Điều đó cũng sẽ cho phép bạn chọn các vị trí điểm ngắt mà không cần sửa đổi mã của bạn (sử dụng lệnh break của pdb). Hoặc bạn có thể kết hợp hai cách tiếp cận; chạy mã của bạn dưới các cuộc gọi pdb, pdb.set_trace() và tất cả các cuộc gọi đó sẽ là các điểm ngắt mà bạn chỉ có thể xóa bằng cách sửa đổi mã của mình.

Bạn có thể gọi mã của mình trong phạm vi pdb bằng cách sử dụng lệnh pdb với lời gọi tập lệnh của bạn làm đối số dòng lệnh hoặc với python -m pdb.

+0

nó sẽ là tuyệt vời nếu bạn có thể xác định nguyên nhân có thể có của BdbQuit như pdb không nâng cao nó trong một số kịch bản. – Alex

+0

đây không phải là câu trả lời hoàn chỉnh, có nhiều hạn chế khác của 'pdb' như nó không thể làm việc trong một nhóm đa xử lý và cứ thế. Bạn không đề cập đến những người. –

-1

Tôi gặp phải điều này khi tôi để lại import pdbpdb.set_trace() trong mã sản xuất của mình. Về cơ bản không có gì ở đó để bao giờ c ontinue mã để cuối cùng nó error'd ra. Tôi cảm thấy giống như một chiếc máy tính.

0

Ngoài câu trả lời của Eirik Fuller, tôi muốn thêm rằng bạn không thể sử dụng pdb trong nội dung nào đó đang chạy trong một quy trình khác. Để gỡ lỗi, bạn có thể kiểm tra câu trả lời này: https://stackoverflow.com/a/23654936/7806805 nhưng có vẻ như rất đáng sợ hoặc bạn có thể làm cho chương trình của bạn chạy trong một chuỗi duy nhất. Tham khảo tài liệu: https://docs.python.org/3/library/concurrent.futures.html. Đối với các sự cố đa xử lý, bạn thậm chí có thể muốn xem qua https://www.reddit.com/r/learnpython/comments/46x9sm/why_is_pdbset_trace_crashing_whenever_it_is_in_an/

Dù sao câu hỏi của bạn thiếu bối cảnh cần thiết. Vui lòng thêm vào câu hỏi của bạn.

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