Gdb는 stdout 대신 파일로 인쇄


104

나는 gdb를 실행 중이며 불행한 신 객체 중 하나를 조사하고 싶습니다. 전체 내용을 보려면 여러 페이지가 필요합니다 (24 인치 모니터를 옆으로 돌리고 있습니다!). 사용하기 쉽도록 gdb에서 개체를 화면 대신 파일로 인쇄하여 열 수 있도록하고 싶습니다. vi와 쉽게 이동할 수 있습니다. gdb의 다재다능 함으로이 작업을 수행 할 수있는 방법이 있어야합니다.

답변:


151

로깅을 활성화해야합니다.

(gdb) set logging on

사용할 파일을 지정할 수 있습니다.

(gdb) set logging file my_god_object.log

그리고 현재 로깅 구성을 검토 할 수 있습니다.

(gdb) show logging

15
출력을 로그 파일 로만 보내려면 set logging redirect on.
Ben C

5
set logging file my_god_object.log전에 설정해야하지 set logging on않습니까?
Herpes Free Engineer

이 플러스 tail -fawk오늘 정말 도움이되었다. 감사!
remcycles apr

12

run명령을 통해 gdb의 출력을 파일로 리디렉션 할 수 있음을 발견했습니다 .

(gdb) run > outfile

11
이는 gdb 자체의 출력이 아니라 디버깅중인 프로그램의 출력입니다. OP는 gdb의 자체 출력을 기록하려고했습니다.


내가 그냥 삭제 한 사용자 GDB의 표준 입력이 QDebug 쓰레기의하는 QT 프로그램을 디버깅하고있어 같은 @thepaul는하지만,이 사실에 매우 유용합니다
rostamn739

@ rostamn739 죄송합니다, 전혀 도움이되지 않았습니다
rostamn739

12

@qubodup의 답변 확장

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

-ex스위치는 GDB 명령을 실행합니다. 따라서 위의 코드는 코어 파일을로드하고 bt명령을 실행 한 다음 quit명령 을 실행합니다. 출력은 backtrace.log화면에 기록됩니다 .

또 다른 유용한 gdb 호출 (모든 스레드의 로컬 변수로 스택 추적 제공)은 다음과 같습니다.

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

일부 시스템에서는 다음을 입력해야합니다.gdb -c core.3599 ...
user7610

1
> gdb core.3599 -ex 'thread apply all bt full'-ex quit 프롬프트없이 실행하려면 --batch 추가 -eg sudo gdb --batch core.3599 -ex 'thread apply all bt full'-ex quit> output .log
David Skelly

9

에서 https://sourceware.org/gdb/onlinedocs/gdb/Logging-Output.html :

gdb 명령의 출력을 파일에 저장할 수 있습니다. gdb의 로깅을 제어하는 ​​몇 가지 명령이 있습니다.

set logging on

로깅을 사용하도록 설정.

set logging off

로깅을 비활성화합니다.

set logging file file

현재 로그 파일의 이름을 변경합니다. 기본 로그 파일은 gdb.txt입니다.

set logging overwrite [on|off]

기본적으로 gdb는 로그 파일에 추가됩니다. 대신 로그 파일을 덮어 쓰도록 로그온을 설정하려면 덮어 쓰기를 설정합니다.

set logging redirect [on|off]

기본적으로 gdb 출력은 터미널과 로그 파일 모두로 이동합니다. 출력이 로그 파일로만 이동하도록하려면 리디렉션을 설정합니다.

show logging

로깅 설정의 현재 값을 표시합니다.


2
인용없이 sourceware.org/gdb/onlinedocs/gdb/Logging-Output.html의 붙여 넣기를 복사합니다 .
Herpes Free Engineer

5

출력을 보면서 (명령 작성을 용이하게하는) gdb를 파일에 기록하는 간단한 방법은 다음을 사용하는 것입니다 tee.

gdb command |& tee gdb.log

1

여기에 좋은 답변이 많이 있지만 여전히 나를 위해 일한 유일한 것을 게시해야합니다.

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

이것은 gdb 바이너리 출력을 동일한 log.txt 파일로 가져 오는 유일한 방법 이며 콘솔에서도 볼 수 있습니다.

편집하다:

주의 : 출력은 gdb 출력과 바이너리 출력간에 부분적으로 동기화되지 않은 것 같습니다. 누군가 확인할 수 있습니까? telnet / ssh 클라이언트에 콘솔에 표시되는 출력을 기록하는 기능이 있는지 확인할 수 있습니다.


1

여기에 여러 가지 답변이 있습니다. 그들은 정확합니다. 한 번에 모든 출력을 수집하는 데 도움이되는 명령을 추가하고 싶습니다. 이것은 거대한 역 추적을 수집 할 때 정말 유용합니다. 로깅 구성을 수행하기 전에 다음을 수행하십시오.

(gdb)set height 0

이 기사에서 찾았습니다 : https://askaralikhan.blogspot.com/2016/05/gdb-all-threads-bt-to-file.html?showComment=1584614942454#c4584028195226351332

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.