奇怪的 lldb 行为(与 gdb 相比)C
Weird lldb behavior (comparing to gdb) C
我来自 freebsd,我习惯使用 GDB 进行调试,不幸的是,GDB 在我的 macbook 上不是 natif,我想使用 LLDB 进行调试。
不幸的是,我不明白这种奇怪的行为:
当我启动一个 C 程序并在一个函数上设置断点,然后使用 "run" 启动它时,我转到了断点,但似乎我可以通读,但在汇编代码中 =硬调试,不像在 GDB 中,它是逐行直线 => 简单调试
看看 .c,(我知道这段代码很糟糕,但这不是重点,它只是为了尝试正确设置 lldb)
int ft_count_point(char *m, int i)
{
int count;
int count_c;
count = 0;
count_c = 0;
while (m[i] != '[=10=]' || (m[i] != '\n' && m[i + 1] != '\n'))
{
if (m[i] == '.')
{
count_c++;
count++;
}
if (m[i] == '\n' || m[i] == '#')
count++;
i++;
}
if (count != 20 && count_c != 16)
return (1);
exit (0);
}
主函数只包含对这个函数的调用和return 0.
看看我在 ft_count_point 上使用带断点的 lldb 得到了什么:
(lldb) target create "./a.out"
Current executable set to './a.out' (x86_64).
(lldb) settings set -- target.run-args "tests/error1"
(lldb) b ft_count_point
Breakpoint 1: where = a.out`ft_count_point + 35
at ft_count_point.c:5, address = 0x00000001000073e3
(lldb) r
Process 17302 launched: './a.out' (x86_64)
AddressSanitizer debugger support is active. Memory error breakpoint
has been installed and you can now use the 'memory history' command.
Process 17302 stopped
* thread #1: tid = 0x43c1e7, 0x00007fff5fc01000 dyld`_dyld_start,
stop reason = exec
frame #0: 0x00007fff5fc01000 dyld`_dyld_start
dyld`_dyld_start:
-> 0x7fff5fc01000 <+0>: popq %rdi
0x7fff5fc01001 <+1>: pushq [=11=]x0
0x7fff5fc01003 <+3>: movq %rsp, %rbp
0x7fff5fc01006 <+6>: andq $-0x10, %rsp
我可以一步一步来,但说真的,这是浪费时间。
看起来像您的程序 re-exec 本身 - 也许这实际上是 ASAN 正在为您做的事情?您可以在 lldb 输出中看到这一点,其中显示:
* thread #1: tid = 0x43c1e7, 0x00007fff5fc01000 dyld`_dyld_start,
stop reason = exec
如果您确实遇到了断点,原因可能是 stop reason = breakpoint 1.1
或任何合适的断点编号。
在 lldb 中,我们停在 re-exec,我猜是 gdb auto-continues 在 exec 之后,这就是为什么你在 gdb 中没有注意到这一点。您应该可以继续,稍后您将遇到真正的断点。
有一个设置来控制是否继续 past exec 可能是个好主意。请随时向 lldb.llvm.org 错误报告程序提交错误。
我来自 freebsd,我习惯使用 GDB 进行调试,不幸的是,GDB 在我的 macbook 上不是 natif,我想使用 LLDB 进行调试。
不幸的是,我不明白这种奇怪的行为:
当我启动一个 C 程序并在一个函数上设置断点,然后使用 "run" 启动它时,我转到了断点,但似乎我可以通读,但在汇编代码中 =硬调试,不像在 GDB 中,它是逐行直线 => 简单调试
看看 .c,(我知道这段代码很糟糕,但这不是重点,它只是为了尝试正确设置 lldb)
int ft_count_point(char *m, int i)
{
int count;
int count_c;
count = 0;
count_c = 0;
while (m[i] != '[=10=]' || (m[i] != '\n' && m[i + 1] != '\n'))
{
if (m[i] == '.')
{
count_c++;
count++;
}
if (m[i] == '\n' || m[i] == '#')
count++;
i++;
}
if (count != 20 && count_c != 16)
return (1);
exit (0);
}
主函数只包含对这个函数的调用和return 0.
看看我在 ft_count_point 上使用带断点的 lldb 得到了什么:
(lldb) target create "./a.out"
Current executable set to './a.out' (x86_64).
(lldb) settings set -- target.run-args "tests/error1"
(lldb) b ft_count_point
Breakpoint 1: where = a.out`ft_count_point + 35
at ft_count_point.c:5, address = 0x00000001000073e3
(lldb) r
Process 17302 launched: './a.out' (x86_64)
AddressSanitizer debugger support is active. Memory error breakpoint
has been installed and you can now use the 'memory history' command.
Process 17302 stopped
* thread #1: tid = 0x43c1e7, 0x00007fff5fc01000 dyld`_dyld_start,
stop reason = exec
frame #0: 0x00007fff5fc01000 dyld`_dyld_start
dyld`_dyld_start:
-> 0x7fff5fc01000 <+0>: popq %rdi
0x7fff5fc01001 <+1>: pushq [=11=]x0
0x7fff5fc01003 <+3>: movq %rsp, %rbp
0x7fff5fc01006 <+6>: andq $-0x10, %rsp
我可以一步一步来,但说真的,这是浪费时间。
看起来像您的程序 re-exec 本身 - 也许这实际上是 ASAN 正在为您做的事情?您可以在 lldb 输出中看到这一点,其中显示:
* thread #1: tid = 0x43c1e7, 0x00007fff5fc01000 dyld`_dyld_start,
stop reason = exec
如果您确实遇到了断点,原因可能是 stop reason = breakpoint 1.1
或任何合适的断点编号。
在 lldb 中,我们停在 re-exec,我猜是 gdb auto-continues 在 exec 之后,这就是为什么你在 gdb 中没有注意到这一点。您应该可以继续,稍后您将遇到真正的断点。
有一个设置来控制是否继续 past exec 可能是个好主意。请随时向 lldb.llvm.org 错误报告程序提交错误。