大友です。

(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