2010-12-27 34 views
7

Tôi đã đăng bài này trên programmers.stackexchange.com, nhưng tôi đã tìm ra nó có thể phù hợp hơn trên SO.Emacs: phương pháp gỡ lỗi python

Tôi sử dụng emacs cho tất cả các nhu cầu chỉnh sửa mã của mình. Thông thường, tôi sẽ sử dụng biên dịch Mx để chạy thử nghiệm của tôi mà tôi sẽ nói cho tôi khoảng 70% những gì tôi cần làm để giữ cho mã theo dõi tuy nhiên gần đây tôi đã tự hỏi làm thế nào nó có thể có thể sử dụng Mx pdb trên những dịp mà nó sẽ là tốt đẹp để đạt một breakpoint và kiểm tra mọi thứ.

Trong googling của tôi, tôi đã tìm thấy some things đề xuất rằng điều này hữu ích/có thể. Tuy nhiên tôi đã không quản lý để làm cho nó hoạt động theo cách mà tôi hoàn toàn hiểu được.

Tôi không biết nếu đó là sự kết hợp của buildout + appengine mà có thể làm cho nó khó khăn hơn nhưng khi tôi cố gắng làm điều gì đó như

M-x pdb 
Run pdb (like this): /Users/twillis/projects/hydrant/bin/python /Users/twillis/bin/pdb /Users/twillis/projects/hydrant/bin/devappserver /Users/twillis/projects/hydrant/parts/hydrant-app/ 

đâu .../bin/python là người phiên dịch xây dựng làm cho với con đường thiết lập cho tất cả các quả trứng.

~/bin/pdb là một kịch bản đơn giản để gọi vào pdb.main sử dụng python phiên dịch hiện tại

HellooKitty:hydrant twillis$ cat ~/bin/pdb 
#! /usr/bin/env python 

if __name__ == "__main__": 
    import sys 
    sys.version_info 
    import pdb 
    pdb.main() 
HellooKitty:hydrant twillis$ 

.../bin/devappserver là kịch bản dev_appserver rằng công thức buildout làm cho dự án gae và .../phần/vòi ứng dụng là đường dẫn đến app.yaml

tôi đầu tiên trình bày với một dấu nhắc

Current directory is /Users/twillis/bin/ 
C-c C-f 

Không có gì xảy ra nhưng

012.351.
HellooKitty:hydrant twillis$ ps aux | grep pdb 
twillis 469 100.0 1.6 168488 67188 s002 Rs+ 1:03PM 0:52.19 /usr/local/bin/python2.5 /Users/twillis/projects/hydrant/bin/python /Users/twillis/bin/pdb /Users/twillis/projects/hydrant/bin/devappserver /Users/twillis/projects/hydrant/parts/hydrant-app/ 
twillis 477 0.0 0.0 2435120 420 s000 R+ 1:05PM 0:00.00 grep pdb 
HellooKitty:hydrant twillis$ 

một cái gì đó đang xảy ra

C-x [space] 

sẽ báo cáo rằng một breakpoint đã được thiết lập. Nhưng tôi không thể xoay xở để có được mọi thứ.

Có vẻ như tôi thiếu điều gì đó hiển nhiên ở đây. Tôi à?

Vì vậy, là gỡ lỗi tương tác trong các emacs đáng giá? gỡ lỗi tương tác một ứng dụng appengine của Google có thể là gì? Bất kỳ đề xuất về cách tôi có thể làm việc này?

+0

đã xem tại đây: http://jjinux.blogspot.com/2008/05/python-debugging-google-app-engine-apps.html – systempuntoout

+0

và tại đây http://code.google.com/p/googleappengine/issues/detail? id = 308 – systempuntoout

Trả lời

4

Một vấn đề cụ thể với GAE là nó chuyển hướng STDOUT tới trình duyệt, bao gồm đầu ra trình gỡ lỗi.

Như được nêu trong pdb documentation, quy trình làm việc thông thường là đặt điểm ngắt trong mã tại điểm bạn cần. Thông thường bạn sẽ làm import pdb; pdb.set_trace(), nhưng trong trường hợp của GAE, bạn cũng sẽ muốn lấy STDIN và STDOUT của mình.Ví dụ, mã này đoạn mã:

def set_trace(): 
    import pdb, sys 
    debugger = pdb.Pdb(stdin=sys.__stdin__, 
     stdout=sys.__stdout__) 
    debugger.set_trace(sys._getframe().f_back) 

Sau đó bắt đầu một vỏ trong emacs và chạy mã của bạn từ đó:

$ ./bin/devappserver /Users/twillis/projects/hydrant/parts/hydrant-app/ 

Để dễ dàng truy cập đến đúng địa chỉ trong một bộ đệm vỏ tương tác trong emacs, Tôi sử dụng poptoshell.el (google, tôi không có đủ danh tiếng để thêm liên kết khác)

Cuối cùng, hãy đảm bảo bạn có phiên bản python đủ gần đây để bao gồm chức năng pdbtrack (bạn gần như chắc chắn , nhưng bạn chắc chắn muốn nó, vì nó cung cấp các phương tiện để st ep thông qua mã trong emacs).

+0

ah điều này thực sự có thể là giải pháp. Tôi sẽ phải chơi với nó một chút, nhưng devappserver grabbing stdin/out như bạn nói có thể là lý do tại sao pdb chỉ treo trong emacs cho tôi. cảm ơn cho đề xuất pdbtrack quá, tôi đã không biết điều đó. –

+0

Tôi chưa hoàn thành công việc này, nhưng đây chắc chắn là một phần của câu đố. –

1

Hãy thử sử dụng pdb.set_trace() trong mã của bạn và sau đó thay vì sử dụng tập lệnh trình điều khiển của bạn, hãy gọi chương trình của bạn bình thường (tôi nghĩ chỉ cần /Users/twillis/projects/hydrant/bin/devappserver /Users/twillis/projects/hydrant/parts/hydrant-app/ sẽ hoạt động trong trường hợp của bạn.) Bạn nên thả vào trình gỡ rối tại điểm mà bạn gọi pdb. set_trace(), và sau đó từ đó bạn có thể thêm breakpoint hoặc bất cứ điều gì khác khi cần thiết.

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