2013-01-09 25 views
5

Tôi đôi khi sử dụng gdb để gỡ lỗi các script python (CPython của khóa học). Nó là hữu ích điển hình để gỡ lỗi các bãi lõi (và khi nó liên quan đến các mô-đun mở rộng c).Cách đặt điểm ngắt trên hàm python trong gdb

Câu hỏi cơ bản là cách đặt điểm ngắt trên hàm python trong gdb. Nói rằng tôi đã có một kịch bản python với hàm foo và tôi muốn phá vỡ ngay sau khi foo được gọi. Tôi đoán thiết lập một breakpoint có điều kiện trên PyEval_EvalFrameEx có thể hoạt động, nhưng không chắc chắn làm thế nào để làm điều đó.

Trả lời

1

Sử dụng kỹ thuật mà bạn đề nghị, công trình này (mặc dù nó không đẹp):

break PyEval_EvalFrameEx if (strcmp((((PyStringObject *)(f->f_code->co_name))->ob_sval), "foo") == 0) 

Ở đây, f là một PyFrameObject. Bạn cũng có thể muốn kiểm tra f->f_code->co_filename để đảm bảo bạn đã có đúng tệp. Lưu ý rằng điều này làm chậm chương trình một chút, kể từ khi bạn đang phá vỡ và so sánh rất nhiều.

GDB 7 có một số macro trợ giúp tốt để xử lý CPython, nhưng tôi không quen thuộc với chúng. Có lẽ một cách tốt hơn để hoàn thành những gì bạn đang tìm kiếm với những thứ đó.