奇怪的lldb行为(与gdb相比)C

时间:2016-01-05 23:55:15

标签: c macos debugging gdb lldb

我来自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] != '\0' || (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);
}

main函数只包含对此fonction的调用并返回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  $0x0
    0x7fff5fc01003 <+3>: movq   %rsp, %rbp
    0x7fff5fc01006 <+6>: andq   $-0x10, %rsp

我可以一步一步地走进去,但是说真的,这是浪费时间。

1 个答案:

答案 0 :(得分:1)

看起来你的程序重新执行 - 也许这实际上是ASAN为你做的事情?您可以在lldb输出中看到这一点,其中显示:

* thread #1: tid = 0x43c1e7, 0x00007fff5fc01000 dyld`_dyld_start,
                   stop reason = exec

如果您实际上已经达到断点,原因将是stop reason = breakpoint 1.1或任何适当的断点数。

在lldb中,我们停止重新执行,我的猜测是在exec之后gdb自动继续,这就是为什么你在gdb中没有注意到这一点。你应该能够继续,你会稍微打一下真正的断点。

最好有一个设置来控制是否继续经过exec。请随意向lldb.llvm.org错误记者提交错误。