gdb: デバッグ情報無し関数から情報あり関数へ step
大友です。
(1) -g付きでコンパイルしたユーザプログラムにある関数を,
(2) -gなしでコンパイルしたシステムにある関数から呼ぶ
というプログラムがあります。
これで(1)の部分だけgdbでデバッグしたいのですが,
複数の関数(1A), (1B), ...が(2)から連続して呼ばれている時,
(1A)からstepすると(1B)以降をデバッグできない事に気が付きました。
概要としては,
/**** cc -O -c main.c -o main.o ****/
#include <stdio.h>
int func1(void);
int func2(void);
int func3(void);
int caller(int);
int
main(int argc, char *argv[])
{
int i, ret;
for (i = 0; i < 2; i++) {
ret = caller(i);
printf("%d returned.\n", ret);
}
ret = func3();
printf("func3 returned %d.\n", ret);
return (1);
}
int
caller(int num)
{
static int (*rel_func[2])(void) = {func1, func2};
int ret;
ret = rel_func[num]();
return (ret);
}
/**** cc -g -c func.c -o func.o ****/
#include <stdio.h>
int
func1(void)
{
printf("func1 started.\n");
return (10);
}
int
func2(void)
{
printf("func2 started.\n");
return (20);
}
int
func3(void)
{
printf("func3 started.\n");
return (30);
}
というプログラムで,
% cc -O -c main.c -o main.o
% cc -g -c func.c -o func.o
% cc main.o func.o
% gdb -q ./a.out
(gdb) break func1
Breakpoint 1 at 0x400704: file func.c, line 6.
(gdb) run
Starting program: /home/user/test/a.out
Breakpoint 1, func1 () at func.c:6
6 printf("func1 started.\n");
(gdb) s
func1 started.
8 return (10);
(gdb) s
9 }
(gdb) s
0x00000000004006ee in caller ()
(gdb) s
Single stepping until exit from function caller,
which has no line number information.
0x000000000040069d in main ()
(gdb) s
Single stepping until exit from function main,
which has no line number information.
10 returned.
func2 started. ←←← ここ
20 returned.
func3 () at func.c:22
22 printf("func3 started.\n");
(gdb)
func2冒頭で停まって欲しいのですが, func3まで行ってしまいます。
デバッグ情報のない関数(x)からデバッグ情報のない関数(y)を呼ぶと,
(y)がデバッグ情報のある関数(A)を呼んでいても停まってくれないようです。
勿論ブレークポイントを張れば停まれますが, ステップ実行ができて欲しいのです。
gdbのラッパが自動でブレークポイントを張るという方法で
回避する方向で見当しているのですが, 何か他に良い方法はないでしょうか。
--
大友紘之
ootomo@za.wakwak.com
Fnews-brouse 1.9(20180406) -- by Mizuno, MWE <mwe@ccsf.jp>
GnuPG Key ID = ECC8A735
GnuPG Key fingerprint = 9BE6 B9E9 55A5 A499 CD51 946E 9BDC 7870 ECC8 A735