gdb を使ったデバッグ

  • ふつうの Linux プログラミング」というほんでバグがある C のコード bug_head.c のデバッグ作業をするときに gdb というツールが紹介されていた
  • デバッグ時に gdb が役に立つので、ひとまずその流れを以下でみてみる

基本的なデバッグの流れ

流れを見た方がわかりやすいのでまず実例からみていく

# コンパイルは -g オプションをつける
$ gcc ./src/bug_head.c -g -o ./bin/bug_head

# gdb をかましてデバッグ対象バイナリを実行する
$ gdb ./bin/bug_head
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-94.el7
Copyright (C) 2013 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 "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/gomi_ningen/src/head...done.
(gdb)

# バイナリを実行する
(gdb) run -n 3
Starting program: /home/gomi_ningen/src/./head -n 3

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7a55d47 in ____strtoll_l_internal () from /lib64/libc.so.6
Missing separate debuginfos, use: debuginfo-install glibc-2.17-157.el7_3.1.x86_64

# セグフォが出ているので問題点を確認すべくスタックトレースを吐き出させる
(gdb) backtrace
#0  0x00007ffff7a55d47 in ____strtoll_l_internal () from /lib64/libc.so.6
#1  0x00000000004008ec in main (argc=3, argv=0x7fffffffe498) at ./head.c:24

# 手元で書いたコードの L24 に問題がありそうなので、該当部分のコードを確認
(gdb) frame 1
#1  0x00000000004008ec in main (argc=3, argv=0x7fffffffe498) at ./head.c:24
24                nlines = atol(optarg);

# L24 周辺のコードを確認
(gdb) list
19      long nlines = DEFAULT_N_LINES;
20
21      while ((opt = getopt_long(argc, argv, "n", longopts, NULL)) != -1) {
22          switch (opt) {
23            case 'n':
24                nlines = atol(optarg);
25                break;
26            case 'h':
27                fprintf(stdout, "Usage: %s [-n LINES] [FILE ...]\n", argv[0]);
28                exit(0);

# L24 の各変数がどうなっているか出力して確認してみる
(gdb) print optarg
$1 = 0x0

# どうやら optarg が NULL のようで、これを atol しようとしてセグフォをはいているのだなと推測できる

以上のように gdb

  • エラーが出た際のスタックトレース
  • 該当部分のソースコード
  • 各変数の状態出力

などが手軽に行えるイカしたツールです。

参考にしたページ

  • https://qiita.com/aosho235/items/d0bc0191f76ec5bd1776

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください