【问题标题】:How can I see source for the current frame in LLDB without setting breakpoints?如何在不设置断点的情况下查看 LLDB 中当前帧的源代码?
【发布时间】:2016-02-24 20:53:55
【问题描述】:

当使用 LLDB 调试一个简单程序时,如果我将调试器设置为在入口处停止,我看不到当前帧的源代码,只在汇编时。

如果设置了断点,那么我会在到达断点后看到每一帧的源代码。

如何在不设置断点的情况下查看当前帧的源代码?

我想在不知道可能运行哪些代码行或函数的情况下跟踪程序的流程。

请注意,list 是不够的,因为它不显示活动行,只是一些来源。

我正在调试 C++ 代码,不过我认为这并不重要。

【问题讨论】:

    标签: debugging lldb


    【解决方案1】:

    我不确定您所说的“当前帧”是什么意思。

    如果您在调试器中停止程序(使用断点或中断它),那么您应该看到您停止的帧的源代码(如果它是具有源代码的帧)。

    但调试器不会观察您的程序在运行时正在做什么。如果它试图这样做,它会过多地干扰程序执行,减慢它的速度,改变线程调度等。调试器会非常努力地不这样做。

    因此,当程序没有停止时,它无法告诉您程序中正在执行哪些堆栈帧。还有其他工具,例如示例,它使用基于时间的堆栈采样来向您展示程序流程的大致轮廓,但由于这些只是某个时间间隔的示例,它们不会获得所有细节。

    您可以通过在调用上放置自动继续断点并使用执行回溯或源列表的命令来观察调用的某些子集。但是,根据您想要观看的调用的热度,这可能会大大降低执行速度。

    【讨论】:

    • --stop-at-entry 不会停止吗?
    • 是的,确实如此,但该设置意味着“在程序输入时停止”。因此,如果您运行“进程启动 -s”,那么 lldb 将在加载任何共享库或执行任何代码之前自动停止进程一次。就堆栈而言,这是一个相当无趣的停止位置(_dyld_start 中将只有一个线程,仅此而已。)这实际上只有在目标运行之前需要在调试器中完成一些工作时.
    • 也许你认为这里提到的“入口”是“函数入口”?事实并非如此。
    • 我不清楚你想达到什么目标,你能更清楚地描述你的目标吗?
    • 大多数用户代码在 main 之前不会运行(静态初始化程序是例外。)所以从 main 开始应该没问题。但是对于任何复杂的程序,单步执行都不是查看流程的有用方法。例如,大多数 UI 程序都依赖于 UI 工具包中的回调,这些回调在事件循环中的某个地方被调用,并且通过步进到达那里将非常乏味。如果代码被分派到其他线程,单步执行将不会进入该代码。通常最好选择您感兴趣的函数子集,并使用断点查看它们是如何被调用的。
    猜你喜欢
    • 1970-01-01
    • 2011-03-28
    • 2019-04-07
    • 2016-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-27
    • 2017-03-20
    相关资源
    最近更新 更多