IT박스

GDB 디버깅 세션을 자동화하는 가장 좋은 방법은 무엇입니까?

itboxs 2020. 11. 30. 07:58
반응형

GDB 디버깅 세션을 자동화하는 가장 좋은 방법은 무엇입니까?


GDB에 스크립팅 메커니즘이 내장되어 있습니까? 예상 스크립트를 코딩해야합니까? 아니면 더 나은 솔루션이 있습니까?

매번 같은 순서의 명령을 보내고 각 명령의 출력을 파일에 저장할 것입니다 (누군가가 더 나은 아이디어를 가지고 있지 않는 한 GDB의 내장 로깅 메커니즘을 사용했을 가능성이 높습니다).


gdb실행 .gdbinit파일 을 실행합니다. 따라서이 파일에 명령을 추가하고 괜찮은지 확인할 수 있습니다. 다음은 .gdbinit모든 f()호출에 대해 역 추적을 인쇄하기 위한 예입니다 .

set pagination off
set logging file gdb.txt
set logging on
file a.out
b f
commands
bt
continue
end
info breakpoints
r
set logging off
quit

나는 방금 비슷한 것을 살펴보고 기본적인 예를 생각해 냈습니다. 곧 잊어 버릴 것임을 알았기에 게시하는 것이 좋을 것이라고 생각했기 :)때문에 질문과 관련이있는 것처럼 여기에 게시하겠습니다.

기본적으로이 예제에서는 코드의 특정 위치에서 몇 가지 변수 값을 얻고 싶었습니다. 프로그램이 충돌 할 때까지 출력합니다. 따라서 다음은 몇 단계 로 충돌보장 되는 작은 프로그램입니다 test.c.

#include <stdio.h>
#include <stdlib.h>

int icount = 1; // default value

main(int argc, char *argv[])
{
  int i;

  if (argc == 2) {
    icount = atoi(argv[1]);
  }

  i = icount;
  while (i > -1) {
    int b = 5 / i;
    printf(" 5 / %d = %d \n", i, b );
    i = i - 1;
  }

  printf("Finished\n");
  return 0;
}

프로그램이 명령 줄 인수를 허용하는 유일한 이유는 충돌하기 전에 단계 수를 선택할 수 있고 배치 모드에서 gdb무시 된다는 것을 보여주기 위해서입니다 --args. 이것은 다음과 같이 컴파일합니다.

gcc -g test.c -o test.exe

그럼, 다음 스크립트를 준비 - 여기에 주요 트릭에 할당하는 것입니다 commandbreakpoint결국 것이다, continue(또한 참조 자동화 GDB : 기능 풋 모든 호출에서 쇼 역 추적을 ). 이 스크립트는 test.gdb다음과 같습니다.

# http://sourceware.org/gdb/wiki/FAQ: to disable the
# "---Type <return> to continue, or q <return> to quit---"
# in batch mode:
set width 0
set height 0
set verbose off

# at entry point - cmd1
b main
commands 1
  print argc
  continue
end

# printf line - cmd2
b test.c:17
commands 2
  p i
  p b
  continue
end

# int b = line - cmd3
b test.c:16
commands 3
  p i
  p b
  continue
end

# show arguments for program
show args
printf "Note, however: in batch mode, arguments will be ignored!\n"

# note: even if arguments are shown;
# must specify cmdline arg for "run"
# when running in batch mode! (then they are ignored)
# below, we specify command line argument "2":
run 2     # run

#start # alternative to run: runs to main, and stops
#continue

Note that, if you intend to use it in batch mode, you have to "start up" the script at the end, with run or start or something similar.

With this script in place, I can call gdb in batch mode - which will generate the following output in the terminal:

$ gdb --batch --command=test.gdb --args ./test.exe 5
Breakpoint 1 at 0x804844d: file test.c, line 10.
Breakpoint 2 at 0x8048485: file test.c, line 17.
Breakpoint 3 at 0x8048473: file test.c, line 16.
Argument list to give program being debugged when it is started is "5".
Note, however: in batch mode, arguments will be ignored!

Breakpoint 1, main (argc=2, argv=0xbffff424) at test.c:10
10    if (argc == 2) {
$1 = 2

Breakpoint 3, main (argc=2, argv=0xbffff424) at test.c:16
16      int b = 5 / i;
$2 = 2
$3 = 134513899

Breakpoint 2, main (argc=2, argv=0xbffff424) at test.c:17
17      printf(" 5 / %d = %d \n", i, b );
$4 = 2
$5 = 2
 5 / 2 = 2 

Breakpoint 3, main (argc=2, argv=0xbffff424) at test.c:16
16      int b = 5 / i;
$6 = 1
$7 = 2

Breakpoint 2, main (argc=2, argv=0xbffff424) at test.c:17
17      printf(" 5 / %d = %d \n", i, b );
$8 = 1
$9 = 5
 5 / 1 = 5 

Breakpoint 3, main (argc=2, argv=0xbffff424) at test.c:16
16      int b = 5 / i;
$10 = 0
$11 = 5

Program received signal SIGFPE, Arithmetic exception.
0x0804847d in main (argc=2, argv=0xbffff424) at test.c:16
16      int b = 5 / i;

Note that while we specify command line argument 5, the loop still spins only two times (as is the specification of run in the gdb script); if run didn't have any arguments, it spins only once (the default value of the program) confirming that --args ./test.exe 5 is ignored.

However, since now this is output in a single call, and without any user interaction, the command line output can easily be captured in a text file using bash redirection, say:

gdb --batch --command=test.gdb --args ./test.exe 5 > out.txt

There is also an example of using python for automating gdb in c - GDB auto stepping - automatic printout of lines, while free running?

Hope this helps,
Cheers!


If a -x with a file is too much for you, just use multiple -ex's. This is an example to track a running program showing (and saving) the backtrace on crashes

sudo gdb -p $(pidof my-app) -batch \
  -ex "set logging on" \
  -ex continue \
  -ex "bt full" \
  -ex quit

참고URL : https://stackoverflow.com/questions/10748501/what-are-the-best-ways-to-automate-a-gdb-debugging-session

반응형