2013-03-06 39 views
13

Tôi đang cố gắng để gỡ lỗi một module mở rộng cho python mà tôi đã viết trong C. Tôi biên dịch nó bằng cách sử dụng sau đây:Python mở rộng gỡ lỗi

python setup.py build -g install --user 

sau đó tôi gỡ lỗi với:

gdb python 
... 
b py_node_make 
run test.py 

Nó ngắt tại py_node_make (một trong các hàm tôi đã xác định), nhưng sau đó tôi thử:

(gdb) print node 
No symbol "node" in current context. 

Hàm tôi đang cố gắng gỡ lỗi là:

static Python_node_t* py_node_make(
     node_t* node) 
{ 
    Python_node_t* pyNode; 

    pyNode = PyObject_New(Python_node_t, &t_node); 
    pyNode->node = node; 
    pyNode->borrowed = true; 

    return pyNode; 
} 

Trả lời

15

Để gỡ lỗi nguồn hoạt động, tiện ích mở rộng C của bạn phải được tạo bằng thông tin gỡ lỗi (gcc -g). Kể từ khi bạn đang lái xe trong quá trình biên soạn với distutils, bạn có thể chỉ định cờ biên dịch sử dụng thông qua các CFLAGS biến môi trường (Installing Python Modules: Tweaking compiler/linker flags):

CFLAGS='-Wall -O0 -g' python setup.py build 

Lưu ý rằng ngay cả khi distutils mặc định đến một mức độ tối ưu hóa cao hơn - O0, bạn thực sự không nên nhận được điều đó Không có biểu tượng "nút" trong ngữ cảnh hiện tại lỗi miễn là -g được chuyển và hầu hết các bản dựng của Python đều vượt qua -g theo mặc định.

+0

Tôi tin rằng sự cố là chức năng đã được tối ưu hóa hoàn toàn. Tôi biết cờ -g đã được thiết lập bởi vì các chức năng khác ở đây và ở đó và rất nhiều thông tin, chỉ cần không py_node_make. – CrazyCasta

+0

Tôi hiểu. py_node_make() là một hàm tĩnh nhỏ và một mục tiêu chính cho inline. Đặt điểm ngắt trên nó vẫn hoạt động, nhưng tên đối số ** node ** bị mất. – scottt

3

Vấn đề là tối ưu hóa. Tôi không chắc chắn làm thế nào để làm điều đó từ dòng lệnh, nhưng trong kịch bản setup.py tôi chỉ cần thêm extra_compile_args=['-O0'], cho các nhà xây dựng mở rộng và tất cả mọi thứ làm việc.

Vẫn muốn (và chấp nhận) câu trả lời có liên quan đến dòng lệnh arg (cái gì đó sau python setup.py build) sẽ thực hiện điều tương tự vì vậy tôi không cần phải có dòng trình biên dịch cụ thể trong tệp setup.py của mình.

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