2011-12-20 43 views
5

Tôi đang cố gắng sử dụng các cơ sở in ấn đẹp của GDB để hiển thị lớp ma trận C++ tùy chỉnh.gdb in đẹp với các cuộc gọi hàm trực tiếp

Lớp học khá chuẩn mà bạn có thể tìm thấy ở mọi nơi. Nó là một mẫu được tham số hóa theo kiểu, và có thể được truy cập với ký pháp kiểu C như mat [i] [j]. Điều này đầu tiên hoàn toàn trả về một mẫu "Slice" khác đại diện cho một hàng hoặc một cột, mà một lần nữa có thể truy cập bởi toán tử [] để trích xuất dữ liệu. Bản thân lớp này đang sử dụng một mảng C đơn giản để lưu trữ, nhưng nó đang thực hiện một số thủ thuật trên nó, giống như một tùy chọn phân bổ trước một ma trận lớn hơn, cho phép bắt đầu khác 0, sử dụng stride vv. giao diện, và tôi không thể sửa đổi nó, hoặc liên kết với mã của riêng tôi một cách dễ dàng.

Các tính năng tùy chỉnh làm cho việc tạo lại mã truy cập dữ liệu trực tiếp bằng Python trở nên đau đớn. Nhưng điều đó có cần thiết không? Nói chung: tại sao nên in ấn tái tạo lại logic của việc truy cập dữ liệu? Tôi không thể sử dụng các cuộc gọi C++ và sử dụng toán tử [] để in phần tử i, j-th? Thực tế là lớp Slice là tạm thời trong GDB trong một yêu cầu như vậy làm phức tạp thêm điều này.

Tôi cũng là người mới bắt đầu với kịch bản lệnh python và GDB. Tôi đã cố gắng để hack các ví dụ để thay thế truy cập dữ liệu với các cuộc gọi gdb.execute, nhưng tôi không có ý tưởng làm thế nào để truy cập tên đối tượng từ hàm to_string, vì vậy tôi có thể sử dụng một cái gì đó như gdb.execute (??? + '[] + str (i) + ']', False, True).

Tôi tự hỏi cách hiệu quả nhất để thực hiện việc này là gì.

Trả lời

5

Tôi không thể sử dụng cuộc gọi C++ và sử dụng toán tử [] để in phần tử i, j-th?

Bạn có thể gọi từ khá-in vào kém quá trình (đang được gỡ rối) sử dụng gdb.parse_and_eval (docs), nhưng điều này có một số nhược điểm:

  • bạn cần một "sống" quá trình để làm điều này (nói cách khác, máy in đẹp của bạn sẽ không hoạt động khi bạn đang gỡ lỗi một bãi chứa lõi)
  • nếu kém hơn bị hỏng theo một cách nào đó, chức năng gọi trong nó có thể sẽ làm hỏng nó nhiều hơn
  • nếu kém hơn nhiều ren, và các prin đẹp ter gọi vào một hàm có thể yêu cầu khóa (ví dụ: malloc), sau đó bạn rất có khả năng gây ra các máy in khá bế tắc, và sẽ không có bất kỳ cách nào để phục hồi từ bế tắc như vậy.
+2

Ai cũng có thể nhét vào một ví dụ, xin vui lòng? – takbal

1

Đây không phải là kịch bản python, nhưng đơn giản command sequences cho phần mở rộng GDB. Tôi đang định nghĩa một lệnh mới có tên là print_matrix.

(gdb) define print_matrix 
Type commands for definition of "print_matrix". 
End with a line saying just "end". 
>set $s_arr = $arg0 
>set $i=0 
>while($i < $arg1) 
>p (int [][$arg2]) *($s_arr + $i) 
>set $i = $i + 1 
>end 
>end 
(gdb) print_matrix arr 10 10 
$90 = {{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}} 
$91 = {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}} 
$92 = {{2, 3, 4, 5, 6, 7, 8, 9, 10, 11}} 
$93 = {{3, 4, 5, 6, 7, 8, 9, 10, 11, 12}} 
$94 = {{4, 5, 6, 7, 8, 9, 10, 11, 12, 13}} 
$95 = {{5, 6, 7, 8, 9, 10, 11, 12, 13, 14}} 
$96 = {{6, 7, 8, 9, 10, 11, 12, 13, 14, 15}} 
$97 = {{7, 8, 9, 10, 11, 12, 13, 14, 15, 16}} 
$98 = {{8, 9, 10, 11, 12, 13, 14, 15, 16, 17}} 
$99 = {{9, 10, 11, 12, 13, 14, 15, 16, 17, 18}} 
(gdb) 

Bạn cũng có thể lưu các lệnh này như một kịch bản và sử dụng tùy chọn -x

gdb -x <commands file name> binary.out 
+0

Cảm ơn, nhưng tôi cần sử dụng cơ sở in ấn khá đẹp vì tích hợp với Eclipse. – takbal

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