如果没有step-mode = on

时间:2017-09-07 09:55:55

标签: c gdb

我有一个与.so文件动态链接的可执行文件,都是用调试符号编译的。

现在,当我使用gdb启动进程并跳过它时,除非我设置step,否则.so命令不会进入函数(在step-mode on中定义)。 / p>

来源可用,gdb当然可以找到它们。

为什么会这样?

以下是通过set debug infrun 1启用的相应调试输出:

34          assert_se(calendar_spec_from_string(input, &c) >= 0);
infrun: infrun_async(0)
(gdb) s
infrun: clear_proceed_status_thread (Thread 0x7ffff7fb3900 (LWP 7009))
infrun: proceed (addr=0xffffffffffffffff, signal=GDB_SIGNAL_DEFAULT)
infrun: proceed: resuming Thread 0x7ffff7fb3900 (LWP 7009)
infrun: resume (step=1, signal=GDB_SIGNAL_0), trap_expected=0, current thread [Thread 0x7ffff7fb3900 (LWP 7009)] at 0x100000e0d
infrun: infrun_async(1)
infrun: prepare_to_wait
infrun: target_wait (-1.0.0, status) =
infrun:   7009.7009.0 [Thread 0x7ffff7fb3900 (LWP 7009)],
infrun:   status->kind = stopped, signal = GDB_SIGNAL_TRAP
infrun: TARGET_WAITKIND_STOPPED
infrun: stop_pc = 0x100000e11
infrun: stepping inside range [0x100000e0d-0x100000e4f]
infrun: resume (step=1, signal=GDB_SIGNAL_0), trap_expected=0, current thread [Thread 0x7ffff7fb3900 (LWP 7009)] at 0x100000e11
infrun: prepare_to_wait
infrun: target_wait (-1.0.0, status) =
infrun:   7009.7009.0 [Thread 0x7ffff7fb3900 (LWP 7009)],
infrun:   status->kind = stopped, signal = GDB_SIGNAL_TRAP
infrun: TARGET_WAITKIND_STOPPED
infrun: stop_pc = 0x100000e15
infrun: stepping inside range [0x100000e0d-0x100000e4f]
infrun: resume (step=1, signal=GDB_SIGNAL_0), trap_expected=0, current thread [Thread 0x7ffff7fb3900 (LWP 7009)] at 0x100000e15
infrun: prepare_to_wait
infrun: target_wait (-1.0.0, status) =
infrun:   7009.7009.0 [Thread 0x7ffff7fb3900 (LWP 7009)],
infrun:   status->kind = stopped, signal = GDB_SIGNAL_TRAP
infrun: TARGET_WAITKIND_STOPPED
infrun: stop_pc = 0x100000e18
infrun: stepping inside range [0x100000e0d-0x100000e4f]
infrun: resume (step=1, signal=GDB_SIGNAL_0), trap_expected=0, current thread [Thread 0x7ffff7fb3900 (LWP 7009)] at 0x100000e18
infrun: prepare_to_wait
infrun: target_wait (-1.0.0, status) =
infrun:   7009.7009.0 [Thread 0x7ffff7fb3900 (LWP 7009)],
infrun:   status->kind = stopped, signal = GDB_SIGNAL_TRAP
infrun: TARGET_WAITKIND_STOPPED
infrun: stop_pc = 0x100000e1b
infrun: stepping inside range [0x100000e0d-0x100000e4f]
infrun: resume (step=1, signal=GDB_SIGNAL_0), trap_expected=0, current thread [Thread 0x7ffff7fb3900 (LWP 7009)] at 0x100000e1b
infrun: prepare_to_wait
infrun: target_wait (-1.0.0, status) =
infrun:   7009.7009.0 [Thread 0x7ffff7fb3900 (LWP 7009)],
infrun:   status->kind = stopped, signal = GDB_SIGNAL_TRAP
infrun: TARGET_WAITKIND_STOPPED
infrun: stop_pc = 0x100000c08
infrun: stepped into subroutine
infrun: inserting step-resume breakpoint at 0x100000e20
infrun: resume (step=0, signal=GDB_SIGNAL_0), trap_expected=0, current thread [Thread 0x7ffff7fb3900 (LWP 7009)] at 0x100000c08
infrun: prepare_to_wait
infrun: target_wait (-1.0.0, status) =
infrun:   7009.7009.0 [Thread 0x7ffff7fb3900 (LWP 7009)],
infrun:   status->kind = stopped, signal = GDB_SIGNAL_TRAP
infrun: TARGET_WAITKIND_STOPPED
infrun: stop_pc = 0x100000e20
infrun: BPSTAT_WHAT_STEP_RESUME
infrun: stepping inside range [0x100000e0d-0x100000e4f]
infrun: resume (step=1, signal=GDB_SIGNAL_0), trap_expected=0, current thread [Thread 0x7ffff7fb3900 (LWP 7009)] at 0x100000e20
infrun: prepare_to_wait
infrun: target_wait (-1.0.0, status) =
infrun:   7009.7009.0 [Thread 0x7ffff7fb3900 (LWP 7009)],
infrun:   status->kind = stopped, signal = GDB_SIGNAL_TRAP
infrun: TARGET_WAITKIND_STOPPED
infrun: stop_pc = 0x100000e23
infrun: stepping inside range [0x100000e0d-0x100000e4f]
infrun: resume (step=1, signal=GDB_SIGNAL_0), trap_expected=0, current thread [Thread 0x7ffff7fb3900 (LWP 7009)] at 0x100000e23
infrun: prepare_to_wait
infrun: target_wait (-1.0.0, status) =
infrun:   7009.7009.0 [Thread 0x7ffff7fb3900 (LWP 7009)],
infrun:   status->kind = stopped, signal = GDB_SIGNAL_TRAP
infrun: TARGET_WAITKIND_STOPPED
infrun: stop_pc = 0x100000e26
infrun: stepping inside range [0x100000e0d-0x100000e4f]
infrun: resume (step=1, signal=GDB_SIGNAL_0), trap_expected=0, current thread [Thread 0x7ffff7fb3900 (LWP 7009)] at 0x100000e26
infrun: prepare_to_wait
infrun: target_wait (-1.0.0, status) =
infrun:   7009.7009.0 [Thread 0x7ffff7fb3900 (LWP 7009)],
infrun:   status->kind = stopped, signal = GDB_SIGNAL_TRAP
infrun: TARGET_WAITKIND_STOPPED
infrun: stop_pc = 0x100000e29
infrun: stepping inside range [0x100000e0d-0x100000e4f]
infrun: resume (step=1, signal=GDB_SIGNAL_0), trap_expected=0, current thread [Thread 0x7ffff7fb3900 (LWP 7009)] at 0x100000e29
infrun: prepare_to_wait
infrun: target_wait (-1.0.0, status) =
infrun:   7009.7009.0 [Thread 0x7ffff7fb3900 (LWP 7009)],
infrun:   status->kind = stopped, signal = GDB_SIGNAL_TRAP
infrun: TARGET_WAITKIND_STOPPED
infrun: stop_pc = 0x100000e4f
infrun: stepped to a different line
infrun: stop_waiting
infrun: clear_step_over_info
infrun: stop_all_threads
infrun: stop_all_threads, pass=0, iterations=0
infrun:   Thread 0x7ffff7fb3900 (LWP 7009) not executing
infrun: stop_all_threads, pass=1, iterations=1
infrun:   Thread 0x7ffff7fb3900 (LWP 7009) not executing
infrun: stop_all_threads done
36          assert_se(calendar_spec_to_string(c, &p) >= 0);
infrun: infrun_async(0)
(gdb) s
infrun: clear_proceed_status_thread (Thread 0x7ffff7fb3900 (LWP 7009))
infrun: proceed (addr=0xffffffffffffffff, signal=GDB_SIGNAL_DEFAULT)
infrun: proceed: resuming Thread 0x7ffff7fb3900 (LWP 7009)
infrun: resume (step=1, signal=GDB_SIGNAL_0), trap_expected=0, current thread [Thread 0x7ffff7fb3900 (LWP 7009)] at 0x100000e4f
infrun: infrun_async(1)
infrun: prepare_to_wait
infrun: target_wait (-1.0.0, status) =
infrun:   7009.7009.0 [Thread 0x7ffff7fb3900 (LWP 7009)],
infrun:   status->kind = stopped, signal = GDB_SIGNAL_TRAP
infrun: TARGET_WAITKIND_STOPPED
infrun: stop_pc = 0x100000e53
infrun: stepping inside range [0x100000e4f-0x100000e91]
infrun: resume (step=1, signal=GDB_SIGNAL_0), trap_expected=0, current thread [Thread 0x7ffff7fb3900 (LWP 7009)] at 0x100000e53
infrun: prepare_to_wait
infrun: target_wait (-1.0.0, status) =
infrun:   -1.0.0 [process -1],
infrun:   status->kind = ignore
infrun: TARGET_WAITKIND_IGNORE
infrun: prepare_to_wait
infrun: target_wait (-1.0.0, status) =
infrun:   7009.7009.0 [Thread 0x7ffff7fb3900 (LWP 7009)],
infrun:   status->kind = stopped, signal = GDB_SIGNAL_TRAP
infrun: TARGET_WAITKIND_STOPPED
infrun: stop_pc = 0x100000e57
infrun: stepping inside range [0x100000e4f-0x100000e91]
infrun: resume (step=1, signal=GDB_SIGNAL_0), trap_expected=0, current thread [Thread 0x7ffff7fb3900 (LWP 7009)] at 0x100000e57
infrun: prepare_to_wait
infrun: target_wait (-1.0.0, status) =
infrun:   -1.0.0 [process -1],
infrun:   status->kind = ignore
infrun: TARGET_WAITKIND_IGNORE
infrun: prepare_to_wait
infrun: target_wait (-1.0.0, status) =
infrun:   7009.7009.0 [Thread 0x7ffff7fb3900 (LWP 7009)],
infrun:   status->kind = stopped, signal = GDB_SIGNAL_TRAP
infrun: TARGET_WAITKIND_STOPPED
infrun: stop_pc = 0x100000e5a
infrun: stepping inside range [0x100000e4f-0x100000e91]
infrun: resume (step=1, signal=GDB_SIGNAL_0), trap_expected=0, current thread [Thread 0x7ffff7fb3900 (LWP 7009)] at 0x100000e5a
infrun: prepare_to_wait
infrun: target_wait (-1.0.0, status) =
infrun:   -1.0.0 [process -1],
infrun:   status->kind = ignore
infrun: TARGET_WAITKIND_IGNORE
infrun: prepare_to_wait
infrun: target_wait (-1.0.0, status) =
infrun:   7009.7009.0 [Thread 0x7ffff7fb3900 (LWP 7009)],
infrun:   status->kind = stopped, signal = GDB_SIGNAL_TRAP
infrun: TARGET_WAITKIND_STOPPED
infrun: stop_pc = 0x100000e5d
infrun: stepping inside range [0x100000e4f-0x100000e91]
infrun: resume (step=1, signal=GDB_SIGNAL_0), trap_expected=0, current thread [Thread 0x7ffff7fb3900 (LWP 7009)] at 0x100000e5d
infrun: prepare_to_wait
infrun: target_wait (-1.0.0, status) =
infrun:   -1.0.0 [process -1],
infrun:   status->kind = ignore
infrun: TARGET_WAITKIND_IGNORE
infrun: prepare_to_wait
infrun: target_wait (-1.0.0, status) =
infrun:   7009.7009.0 [Thread 0x7ffff7fb3900 (LWP 7009)],
infrun:   status->kind = stopped, signal = GDB_SIGNAL_TRAP
infrun: TARGET_WAITKIND_STOPPED
infrun: stop_pc = 0x100000c48
infrun: stepped into subroutine
infrun: inserting step-resume breakpoint at 0x100000e62
infrun: resume (step=0, signal=GDB_SIGNAL_0), trap_expected=0, current thread [Thread 0x7ffff7fb3900 (LWP 7009)] at 0x100000c48
infrun: prepare_to_wait
infrun: target_wait (-1.0.0, status) =
infrun:   -1.0.0 [process -1],
infrun:   status->kind = ignore
infrun: TARGET_WAITKIND_IGNORE
infrun: prepare_to_wait
infrun: target_wait (-1.0.0, status) =
infrun:   7009.7009.0 [Thread 0x7ffff7fb3900 (LWP 7009)],
infrun:   status->kind = stopped, signal = GDB_SIGNAL_TRAP
infrun: TARGET_WAITKIND_STOPPED
infrun: stop_pc = 0x100000e62
infrun: BPSTAT_WHAT_STEP_RESUME
infrun: stepping inside range [0x100000e4f-0x100000e91]
infrun: resume (step=1, signal=GDB_SIGNAL_0), trap_expected=0, current thread [Thread 0x7ffff7fb3900 (LWP 7009)] at 0x100000e62
infrun: prepare_to_wait
infrun: target_wait (-1.0.0, status) =
infrun:   -1.0.0 [process -1],
infrun:   status->kind = ignore
infrun: TARGET_WAITKIND_IGNORE
infrun: prepare_to_wait
infrun: target_wait (-1.0.0, status) =
infrun:   7009.7009.0 [Thread 0x7ffff7fb3900 (LWP 7009)],
infrun:   status->kind = stopped, signal = GDB_SIGNAL_TRAP
infrun: TARGET_WAITKIND_STOPPED
infrun: stop_pc = 0x100000e65
infrun: stepping inside range [0x100000e4f-0x100000e91]
infrun: resume (step=1, signal=GDB_SIGNAL_0), trap_expected=0, current thread [Thread 0x7ffff7fb3900 (LWP 7009)] at 0x100000e65
infrun: prepare_to_wait
infrun: target_wait (-1.0.0, status) =
infrun:   -1.0.0 [process -1],
infrun:   status->kind = ignore
infrun: TARGET_WAITKIND_IGNORE
infrun: prepare_to_wait
infrun: target_wait (-1.0.0, status) =
infrun:   7009.7009.0 [Thread 0x7ffff7fb3900 (LWP 7009)],
infrun:   status->kind = stopped, signal = GDB_SIGNAL_TRAP
infrun: TARGET_WAITKIND_STOPPED
infrun: stop_pc = 0x100000e68
infrun: stepping inside range [0x100000e4f-0x100000e91]
infrun: resume (step=1, signal=GDB_SIGNAL_0), trap_expected=0, current thread [Thread 0x7ffff7fb3900 (LWP 7009)] at 0x100000e68
infrun: prepare_to_wait
infrun: target_wait (-1.0.0, status) =
infrun:   7009.7009.0 [Thread 0x7ffff7fb3900 (LWP 7009)],
infrun:   status->kind = stopped, signal = GDB_SIGNAL_TRAP
infrun: TARGET_WAITKIND_STOPPED
infrun: stop_pc = 0x100000e6b
infrun: stepping inside range [0x100000e4f-0x100000e91]
infrun: resume (step=1, signal=GDB_SIGNAL_0), trap_expected=0, current thread [Thread 0x7ffff7fb3900 (LWP 7009)] at 0x100000e6b
infrun: prepare_to_wait
infrun: target_wait (-1.0.0, status) =
infrun:   -1.0.0 [process -1],
infrun:   status->kind = ignore
infrun: TARGET_WAITKIND_IGNORE
infrun: prepare_to_wait
infrun: target_wait (-1.0.0, status) =
infrun:   7009.7009.0 [Thread 0x7ffff7fb3900 (LWP 7009)],
infrun:   status->kind = stopped, signal = GDB_SIGNAL_TRAP
infrun: TARGET_WAITKIND_STOPPED
infrun: stop_pc = 0x100000e91
infrun: stepped to a different line
infrun: stop_waiting
infrun: clear_step_over_info
infrun: stop_all_threads
infrun: stop_all_threads, pass=0, iterations=0
infrun:   Thread 0x7ffff7fb3900 (LWP 7009) not executing
infrun: stop_all_threads, pass=1, iterations=1
infrun:   Thread 0x7ffff7fb3900 (LWP 7009) not executing
infrun: stop_all_threads done
37          printf("\"%s\" → \"%s\"\n", input, p);
infrun: infrun_async(0)

1 个答案:

答案 0 :(得分:1)

似乎与" -Wl,-z,现在"有关。链接器的选项。

手册页说:

现在 - 生成可执行文件或共享库时,将其标记为告诉动态链接器在程序启动时解析所有符号,或者将共享库链接到使用dlopen时,而不是将函数调用解析推迟到首次调用函数时。

当您设置step-mode on并gebug与此选项链接的可执行文件时,您可能会注意到您没有直接进入共享库中的函数,但最初是在某个地方

(gdb) s
0x0000555555554638 in ?? ()

不能确切地说出它是什么。