2009-04-08 26 views
6

Khi nhấn điểm ngắt và bước vào các hàm, gdb phiên bản 6.8 sẽ in tên hàm theo sau các đối số hàm.Làm cách nào để GDB không in các giá trị tham số chức năng khi "bước vào"?

Nó chỉ xảy ra, trong chương trình tôi đang gỡ lỗi, một trong các giá trị tham số là một bản ghi HUGE được chuyển qua tham chiếu. gdb in tên biến theo sau là TẤT CẢ các biến thành viên của nó. Nó theo nghĩa đen mất gdb một hoặc hai phút để in tất cả các biến thành viên chứa trong lớp ... mà thực sự gây phiền nhiễu khi gỡ lỗi.

Tôi chắc chắn có cài đặt để tắt hành vi này, cài đặt đó là gì?

Trả lời

10

Tìm thấy nó, cuối cùng. Để vô hiệu hóa đầu ra hoàn toàn:

set print frame-arguments none 

Để in chỉ có giá trị vô hướng và bỏ qua mảng & struct:

set print frame-arguments scalars 

Để bật việc in ấn trở lại vào lúc:

set print frame-arguments all 
1

Tôi có một cách mà tôi đã luôn luôn làm điều này, nhưng nhìn thấy câu hỏi của bạn làm cho tôi tò mò để xem nếu có một cơ chế tốt hơn. Tôi không tìm thấy gì cả. Bạn có thể luôn đặt một điểm ngắt bên trong hàm bạn đang bước vào, nhưng TRƯỚC KHI bạn thực hiện bước này, hãy sử dụng lệnh 'lệnh' để báo cho gdb biết rằng bạn không muốn nó in bất cứ thứ gì cả khi nó chạm breakpoint đó. Một ví dụ sẽ làm cho mọi thứ rõ ràng hơn ...

Bạn sẽ nhận thấy rằng khi tôi chạy chương trình, tôi dừng lại ở điểm ngắt trên dòng 10 (gọi tới foo) và nó in ngữ cảnh hiện tại của tôi. Sau khi phát lệnh 'lệnh 2' và yêu cầu gdb im lặng trên điểm ngắt đó, không có gì được in ra khi tôi nhấn nó. Tôi đã làm backtrace (bt) chỉ để cho thấy rằng tôi đã được nơi tôi muốn được.

Hope this helps:

> cat tmp.cpp 

#include <stdio.h> 

void foo(int a) 
{ 
     printf ("%d\n", a); 
} 

int main() 
{ 
     foo(0); 

     return 0; 
} 

> g++ -g tmp.cpp 
> gdb a.out 
GNU gdb Fedora (6.8-27.el5) 
Copyright (C) 2008 Free Software Foundation, Inc. 
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> 
This is free software: you are free to change and redistribute it. 
There is NO WARRANTY, to the extent permitted by law. Type "show copying" 
and "show warranty" for details. 
This GDB was configured as "i386-redhat-linux-gnu"... 
(gdb) break 10 
Breakpoint 1 at 0x8048491: file tmp.cpp, line 10. 
(gdb) break 5 
Breakpoint 2 at 0x804846a: file tmp.cpp, line 5. 
(gdb) run 
Starting program: /home/ronb/software/a.out 

Breakpoint 1, main() at tmp.cpp:10 
10    foo(0); 
(gdb) commands 2 
Type commands for when breakpoint 2 is hit, one per line. 
End with a line saying just "end". 
>silent 
>end 
(gdb) c 
Continuing. 
(gdb) bt 
#0 foo (a=0) at tmp.cpp:5 
#1 0x0804849d in main() at tmp.cpp:10 
(gdb) 
Các vấn đề liên quan