Gdb in ra tệp thay vì stdout


104

Tôi đang chạy gdb và muốn kiểm tra một trong những đối tượng thần không may mắn đó. Phải mất nhiều trang (và tôi có màn hình 24 inch quay sang một bên!) Để xem toàn bộ. Để dễ sử dụng, tôi muốn gdb in đối tượng ra tệp thay vì màn hình để tôi có thể mở nó trong vi và di chuyển xung quanh một cách dễ dàng Với tất cả tính linh hoạt của gdb, chắc chắn phải có một cách để làm điều này, phải không?

Câu trả lời:


151

Bạn cần kích hoạt ghi nhật ký.

(gdb) set logging on

Bạn có thể cho nó biết tệp nào để sử dụng.

(gdb) set logging file my_god_object.log

Và bạn có thể kiểm tra cấu hình ghi nhật ký hiện tại.

(gdb) show logging

15
Và nếu bạn muốn đầu ra chỉ đến tệp nhật ký, hãy sử dụng set logging redirect on.
Ben C

5
Chúng ta không nên đặt set logging file my_god_object.logtrước set logging on?
Kỹ sư tự do Herpes

Điều này cộng tail -fawkthực sự hữu ích ngày hôm nay. Cảm ơn!
remcycles

12

Tôi thấy rằng bạn có thể chuyển hướng đầu ra từ gdb sang một tệp thông qua runlệnh:

(gdb) run > outfile

11
Đó sẽ là đầu ra từ chương trình đang được gỡ lỗi, không phải đầu ra từ chính gdb. OP muốn ghi lại đầu ra của chính gdb.
paul


@thepaul nhưng điều này là trong thực tế rất hữu ích như tôi gỡ một chương trình QT mà chỉ xé vụn gdb của stdin với nó QDebug rác
rostamn739

@ rostamn739 rất tiếc, không giúp được gì cả
rostamn739

12

Mở rộng câu trả lời của @ qubodup

gdb core.3599 -ex bt -ex quit |& tee backtrace.log

công -extắc chạy lệnh gdb. Vì vậy, ở trên tải tệp lõi, chạy btlệnh, sau đó quitlệnh. Đầu ra được ghi vào backtrace.logvà cả trên màn hình.

Một lệnh gọi gdb hữu ích khác (cung cấp stacktrace với các biến cục bộ từ tất cả các luồng) là

gdb core.3599 -ex 'thread apply all bt full' -ex quit

Trên một số hệ thống, bạn cần phải gõgdb -c core.3599 ...
user7610

1
> gdb core.3599 -ex 'thread áp dụng tất cả bt đầy đủ' -ex thoát Thêm --batch để chạy mà không có lời nhắc -eg sudo gdb --batch core.3599 -ex 'thread áp dụng tất cả bt full' -ex thoát> đầu ra .log
David Skelly

9

Từ https://sourceware.org/gdb/onlineocs/gdb/Logging-Output.html :

Bạn có thể muốn lưu kết quả đầu ra của các lệnh gdb vào một tệp. Có một số lệnh để kiểm soát việc ghi nhật ký của gdb.

set logging on

Bật ghi nhật ký.

set logging off

Tắt ghi nhật ký.

set logging file file

Thay đổi tên của tệp nhật ký hiện tại. Logfile mặc định là gdb.txt.

set logging overwrite [on|off]

Theo mặc định, gdb sẽ thêm vào logfile. Đặt ghi đè nếu bạn muốn thiết lập đăng nhập để ghi đè lên tệp nhật ký.

set logging redirect [on|off]

Theo mặc định, đầu ra gdb sẽ chuyển đến cả terminal và logfile. Đặt chuyển hướng nếu bạn muốn đầu ra chỉ đến tệp nhật ký.

show logging

Hiển thị các giá trị hiện tại của cài đặt ghi nhật ký.



5

Một phương pháp đơn giản để đăng nhập gdb vào một tệp trong khi vẫn thấy kết quả đầu ra (giúp giảm bớt việc viết lệnh) là sử dụng tee:

gdb command |& tee gdb.log

1

Mặc dù có rất nhiều câu trả lời hay ở đây, tôi vẫn phải đăng điều duy nhất phù hợp với tôi:

[niko@my-laptop]# gdb MyBinary 2>&1 log.txt

Đây là cách duy nhất để có được đầu ra gdb nhị phân vào cùng một tệp log.txt, đồng thời nhìn thấy nó trên bảng điều khiển.

BIÊN TẬP:

Thận trọng: Đầu ra dường như không được đồng bộ hóa một phần giữa đầu ra gdb và đầu ra nhị phân. Ai đó có thể xác nhận? Bạn có thể muốn kiểm tra xem ứng dụng telnet / ssh của mình có chức năng ghi lại đầu ra mà bạn thấy trong bảng điều khiển của mình hay không.


1

Bạn đã có nhiều câu trả lời ở đây. Họ là chính xác. Tôi chỉ muốn thêm một lệnh sẽ giúp bạn thu thập tất cả các đầu ra cùng một lúc. Điều này thực sự hữu ích khi bạn thu thập được một dấu vết lớn. Trước khi thực hiện bất kỳ cấu hình ghi nhật ký nào, hãy làm như sau:

(gdb)set height 0

Tôi tìm thấy nó trên bài viết này: https://askaralikhan.blogspot.com/2016/05/gdb-all-threads-bt-to-file.html?showComment=1584614942454#c4584028195226351332

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.