首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在lldb调试器中,为什么程序计数器会倒退?

在LLDB调试器中,程序计数器(Program Counter,简称PC)倒退的情况可能是由于多种原因造成的。以下是一些可能导致程序计数器倒退的基础概念、原因分析以及相应的解决方法:

基础概念

  • 程序计数器(PC):是一个寄存器,用于存储当前正在执行的指令的地址。
  • LLDB:是一个强大的调试器,广泛用于macOS和iOS平台的开发。

可能的原因及解决方法

  1. 断点设置
    • 原因:当程序遇到断点时,LLDB会暂停执行,并将PC设置到断点指令的下一条指令。如果断点被频繁触发,可能会给人一种PC倒退的错觉。
    • 解决方法:检查断点的设置,确保它们位于预期的位置,并且没有意外触发的情况。
  • 单步调试
    • 原因:在使用单步调试(如step overstep into)时,如果操作不当,可能会导致PC跳转到之前的指令。
    • 解决方法:仔细检查每一步的操作,确保按照预期的方式单步执行。
  • 异常处理
    • 原因:程序在处理异常时可能会跳转到异常处理代码,这可能会使PC看起来像是倒退了。
    • 解决方法:检查异常处理代码,确保它们正确地处理了异常情况,并且没有导致PC的不正常跳转。
  • 编译器优化
    • 原因:编译器优化可能会导致指令重排,使得PC在调试时看起来像是倒退。
    • 解决方法:尝试关闭编译器优化(例如,在Xcode中设置Optimization LevelNone),然后重新编译并调试程序。
  • 多线程问题
    • 原因:在多线程环境中,一个线程的执行可能会影响另一个线程的PC,导致看起来像是倒退。
    • 解决方法:使用LLDB的多线程调试功能,检查各个线程的状态,确保它们按照预期执行。

示例代码

以下是一个简单的示例,展示如何在LLDB中设置断点并单步调试:

代码语言:txt
复制
func exampleFunction() {
    print("Start")
    let x = 10
    let y = x + 5
    print("End")
}

exampleFunction()

在LLDB中:

代码语言:txt
复制
(lldb) breakpoint set --name exampleFunction
(lldb) run
(lldb) thread backtrace
(lldb) step over
(lldb) step into

总结

程序计数器倒退可能是由于断点、单步调试、异常处理、编译器优化或多线程问题等多种原因造成的。通过仔细检查这些方面,并采取相应的解决方法,可以有效地解决这一问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Swift进阶-LLDB调试

程序猿最好的利器就是开发工具,iOS开发者最基本,最关键的一点就是熟练使用Xcode,而LLDB则是Xcode中至关重要的一环。...target 在调试器对象上操作的命令 thread 中的一个或多个线程操作的命令目前的过程 type 在类型系统上操作的命令 version 显示LLDB调试器版本 watchpoint 操作上观察点的命令...将程序计数器设置为新地址 kill 终止当前目标进程 l 使用几个速记中的一个列出相关的源代码格式 list 使用几个速记中的一个列出相关的源代码格式 n 源级单步,单步调用。...显示任何返回值与LLDB的默认格式 q 退出LLDB调试器 r 在调试器中启动可执行文件 rbreak 在可执行文件中设置断点或断点集。 repl 评估当前线程上的表达式。...显示任何返回值与LLDB的默认格式 run 在调试器中启动可执行文件 s 源级单步,单步调用。

87930

XCode调试器LLDB

LLDB 绑定在 Xcode 内部,存在于主窗口底部的控制台中。调试器允许你在程序运行的特定时暂停它,你可以查看变量的值,执行自定的指令,并且按照你所认为合适的步骤来操作程序的进展。...与此同时,让我们以在调试器中打印变量来开始我们的旅程吧 基础 这里有一个简单的小程序,它会打印一个字符串。注意断点已经被加在第 8 行。断点可以通过点击 Xcode 的源码窗口的侧边槽进行创建。...这不仅会改变调试器中的值,实际上它改变了程序中的值。这时候继续执行程序,将会打印 42 red balloons。神奇吧。...命令在调试器中修改它们了。...就像你可以在 C 语言中用 int a = 0 来声明一个变量一样,你也可以在 LLDB 中做同样的事情。不过为了能使用声明的变量,变量必须以美元符开头。

1.3K60
  • Linux编译C++

    调试器,如** CLion**,当然其也可以在 terminal 中使用。...安装GDB调试器 yum install gdb (CentOS) gdb -v 查看gdb是否安装成功 安装LLDB调试器(暂时不写) 大多数电脑还是用GDB作为调试器的,一般只有MAC使用且内置...LLDB,暂时先不写这个 安装g++编译器 ​ yum install gcc-g++ ​ gcc -v 查看是否安装成功 通过g++编译程序 创建程序main.cpp,func.cpp.../out执行程序 设置断点 设置断点之前我们进入gdb调试 gdb out 开始Debug b main 在main函数设置断点(此时程序会停在初始化的第一条语句) run 执行程序 查看栈...frame 可以查看程序在哪一个函数 此时执行frame可以看到程序进入了change()中 ​ 我们继续执行代码,此时跳出函数后执行frame后,返回main函数中 ​ 我尝试画了一张图应该是这样

    22.8K50

    XCode调试器LLDB

    LLDB 绑定在 Xcode 内部,存在于主窗口底部的控制台中。调试器允许你在程序运行的特定时暂停它,你可以查看变量的值,执行自定的指令,并且按照你所认为合适的步骤来操作程序的进展。...与此同时,让我们以在调试器中打印变量来开始我们的旅程吧 基础 这里有一个简单的小程序,它会打印一个字符串。注意断点已经被加在第 8 行。断点可以通过点击 Xcode 的源码窗口的侧边槽进行创建。...这不仅会改变调试器中的值,实际上它改变了程序中的值。这时候继续执行程序,将会打印 42 red balloons。神奇吧。...命令在调试器中修改它们了。...就像你可以在 C 语言中用 int a = 0 来声明一个变量一样,你也可以在 LLDB 中做同样的事情。不过为了能使用声明的变量,变量必须以美元符开头。

    1.4K30

    iOS开发 Xcode的各种调试、DEBUG

    所以我们这么做: 编辑断点 添加条件Condition 还可以Action中在条件断点触发时执行事件 如:输出信息 4.方法断点 打印调试 尽管ARC已经让内存管理变得简单、省时和高效,但是在object...LLDB 绑定在 Xcode 内部,存在于主窗口底部的控制台中。调试器允许你在程序运行的特定时暂停它,你可以查看变量的值,执行自定的指令,并且按照你所认为合适的步骤来操作程序的进展。...参考: 与调试器共舞 - LLDB 的华尔兹 LLDB调试命令初探 About LLDB and Xcode The LLDB Debugger 基础 help 在控制台输入help,显示控制台支持的lldb...第一个,continue 按钮,会取消程序的暂停,允许程序正常执行 (要么一直执行下去,要么到达下一个断点)。...在 LLDB 中,你可以使用 process continue 命令来达到同样的效果,它的别名为 continue,或者也可以缩写为 c。

    2.3K50

    lldb 入坑指北(1) - 给Xcode批量添加启用&禁用断点功能

    如果给 Xcode 批量添加启用&禁用断点功能,是否会提高你的工作效率? 如果都是NO,那么,请先阅读 与调试器共舞 - LLDB 的华尔兹[1] 后再回来阅读本文章。...API 架构 通过 lldb 相关 API,构建自己的效率工具(Python 脚本) 入门 LLDB LLDB 是一个开源调试器,它已经被内置在 Xcode 程序中。...创建一个程序 在 viewDidLoad 处添加添加断点 运行程序,并使程序停在断点处 在 Console 区域输入 po self 并回车 观察输出结果 当程序暂停后(通过断点或者手动点击暂停按钮),...LLDB 本身支持用户自定义命令,比如通过脚本可以自定义一个pviews 命令,该命令可以打印 APP 所有的视图。 该命令已经在 Chisel 中实现。...在 lldb 中载入脚本 (lldb) command script import ~/ls.py 执行命令 (lldb) ls ./ Applications Users

    1.1K10

    Voltron:一款功能强大的可扩展调试器UI工具包

    关于Voltron Voltron是一款功能强大的可扩展调试器UI工具包,该工具基于Python开发,旨在通过引入程序视图来提升和改善各种调试器(LLDB、GDB、VDB和WinDbg)的用户体验。...Voltron可以通过调试器来获取和显示数据,并通过在其他TTY中运行这些视图来帮助构建一个定制的调试器用户界面,以满足广大安全测试人员的需求。.../install.sh -s 我们还可以将其安装到虚拟环境中(仅支持LLDB): $ ..../install.sh -v /path/to/venv -b lldb 工具使用 如果你的调试器提供了初始化脚本,可以直接配置其在启动时(entry.py入口点脚本)加载Voltron。...比如说在macOS上,脚本路径为“/Library/Python/2.7/site-packages/voltron/entry.py”,install.sh脚本会将其添加进GDB和LLDB的相关路径中

    1.2K10

    Xcode Debug 大全

    LLDB 绑定在 Xcode 内部,存在于主窗口底部的控制台中。调试器允许你在程序运行的特定时暂停它,你可以查看变量的值,执行自定的指令,并且按照你所认为合适的步骤来操作程序的进展。...(这里有一个关于调试器如何工作的总体的解释。) 你以前有可能已经使用过调试器,即使只是在 Xcode 的界面上加一些断点。但是通过一些小的技巧,你就可以做一些非常酷的事情。...参考: 与调试器共舞 - LLDB 的华尔兹 LLDB调试命令初探 About LLDB and Xcode The LLDB Debugger 基础 help 在控制台输入help,显示控制台支持的lldb...第一个,continue 按钮,会取消程序的暂停,允许程序正常执行 (要么一直执行下去,要么到达下一个断点)。...在 LLDB 中,你可以使用 process continue 命令来达到同样的效果,它的别名为 continue,或者也可以缩写为 c。

    1.2K21

    lldb 入坑指北(1) - 给Xcode批量添加启用&禁用断点功能

    (Python脚本) ---- LLDB LLDB 是一个开源调试器,它已经被内置在 Xcode 程序中。...创建一个程序 在 viewDidLoad 处添加添加断点 运行程序,并使程序停在断点处 在 Console 区域输入po self并回车 观察输出结果 当程序暂停后(通过断点或者手动点击暂停按钮),Console...LLDB 本身支持用户自定义命令,比如通过脚本可以自定义一个pviews 命令,该命令可以打印APP所有的视图。 ps.该命令已经在 Chisel 中实现。...在lldb中载入脚本 (lldb) command script import ~/ls.py 执行命令 (lldb) ls ./ Applications Users ......参考文档 lldb命令 Xcode 断点文档 LLDB Python Reference 与调试器共舞 – LLDB 的华尔兹 http://ios.jobbole.com/81794/ https:/

    83020

    汇编和栈

    由于基本指针已保存到堆栈中并设置为当前堆栈指针,因此只需知道基本指针寄存器中的值即可遍历堆栈。调试器在向您显示堆栈跟踪时会执行此操作。...您可以通过选择不同的帧并在 LLDB 控制台中键入 cpx rbp 或 cpx rsp 在 LLDB 中对此进行验证。 那么,为什么这两个寄存器很重要?...在 LLDB 中,键入以下内容: (lldb) si 这个命令是单步调试的命令,它告诉 LLDB 执行下一条指令,然后暂停调试器。 现在,您已进入 StackWalkthrough。...奇怪的格式是由于该命令在 gdb 中的常用,您看到此命令语法已移植到 lldb 中,从而使从调试器的转换更加容易。...为什么一个引用一个看似随机的值? 答案是由嵌入到寄存器应用程序的调试构建中的 DWARF 调试信息存储。你可以把这些信息转储到内存中,帮助你了解一个变量在引用什么。

    3.7K20

    lldb-入坑指北(1)-给xcode添加批量启用禁用断点功能

    (Python脚本) ---- LLDB LLDB 是一个开源调试器,它已经被内置在 Xcode 程序中。...创建一个程序 在 viewDidLoad 处添加添加断点 运行程序,并使程序停在断点处 在 Console 区域输入po self并回车 观察输出结果 当程序暂停后(通过断点或者手动点击暂停按钮),Console...LLDB 本身支持用户自定义命令,比如通过脚本可以自定义一个pviews 命令,该命令可以打印APP所有的视图。 ps.该命令已经在 Chisel 中实现。...在lldb中载入脚本 (lldb) command script import ~/ls.py 执行命令 (lldb) ls ./ Applications Users ......参考文档 lldb命令 Xcode 断点文档 LLDB Python Reference 与调试器共舞 – LLDB 的华尔兹 http://ios.jobbole.com/81794/ https:/

    1.1K31

    用Android Studio调试Framework层代码

    Android程序员不得不知的调试技巧。 本文以webview loadUrl和域名解析为例,介绍配合使用LLDB和Android Studio调试Framework代码的技巧。...调试需要堆栈、符号等信息都保存在JVM中,调试器(debugger)需要通过一种渠道获取这些信息,并通过这个渠道发送调试指令给JVM,JDWP就是调试器与JVM通信的渠道。...Exclued 不必要的文件夹 在断点调试时,JVM会告诉AS自己在xx.java的第xx行被断住了,AS就会定位到这个位置,但是如果有重复的文件的名的,往往会出现定位不准的情况,所以需要把不必要的文件夹排除在整个源码结构之外...在monitor中我们可以看到有3列,分别是 进程名(以包名显示) PID(Process ID) 端口号(映射端口号/实际端口号) 点击我们要调试的browser程序的那一行,会出现一只绿色的bug...---- C++层调试 Android Framework中native代码的调试方法采用的是 2.2以上版本的Android Studio配合LLDB调试器。

    4.8K51

    XCode的debug断点调试

    第一个,continue 按钮,会取消程序的暂停,允许程序正常执行 (要么一直执行下去,要么到达下一个断点)。...在 LLDB 中,你可以使用 process continue 命令来达到同样的效果,它的别名为 continue,或者也可以缩写为 c。...如果你确实想跳进一个函数调用来调试或者检查程序的执行情况,那就用第三个按钮,step in,或者在LLDB中使用 thread step in,step,或者 s 命令。...我们会一个个看过来并介绍 LLDB 中等价的命令 (是的,你可以在调试器内部添加断点)。 在 Xcode 的左侧面板,有一组按钮。其中一个看起来像断点。...在这里你可以看到所有的断点 - 在 LLDB 中通过 breakpoint list (或者 br li) 命令也做同样的事儿。

    5.6K71

    为什么在 Eclipse 中,运行本程序却是另外一个程序的结果?

    文章目录 前言 一、错误产生场景 1.1、执行一个无误的 Java 程序(即产生结果的程序) 1.2、执行未出结果的 Java 程序 二、错误处理 总结 ---- 前言 你使用 Eclipse 敲代码的时候...,有没有遇到过这样一种情况,明明我点击运行本程序结果却是另外一个程序的结果?...这是为什么呢?话不多说,我们从实际案例来分析错误原因。...---- 一、错误产生场景 1.1、执行一个无误的 Java 程序(即产生结果的程序) 首先我们先执行一个 Java 程序SwitchToIfElseWithSwitch如下: package review3...要做一个细心的程序员哦! ---- 我是白鹿,一个不懈奋斗的程序猿。望本文能对你有所裨益,欢迎大家的一键三连!若有其他问题、建议或者补充可以留言在文章下方,感谢大家的支持!

    2.6K41

    如何在Electra越狱的设备上使用LLDB调试应用程序

    在3月18日的时候,我就曾发表过一篇关于在Electra越狱的设备上使用LLDB调试应用程序的文章。本文我将在此基础上,做进一步的更新优化。...接着在Xcode中你应该看到,如下红框内所示的信息: ? 等到“准备调试支持iPhone”完成。然后在设备上检查 /Developer/usr/bin/debugserver。...现在,在Mac上打开另一个控制台,然后运行 ? 在LLDB控制台中运行 ? 在LLDB下运行应用程序 在你的Mac控制台上,连接iPhone: ? 在iPhone的控制台中运行 ?...现在,在Mac上打开另一个控制台,然后运行 ? 在LLDB控制台中运行 ? 重要提示!...如果你遇到了错误则, 在没有调试器的情况下运行应用程序 如前一节所述,将调试器attach到应用程序 关闭(LLDB)应用程序 尝试在调试器下再次运行应用程序 *参考来源:kov4l3nko,FB小编

    2.3K40

    XCode的debug断点调试

    第一个,continue 按钮,会取消程序的暂停,允许程序正常执行 (要么一直执行下去,要么到达下一个断点)。...在 LLDB 中,你可以使用 process continue 命令来达到同样的效果,它的别名为 continue,或者也可以缩写为 c。...如果你确实想跳进一个函数调用来调试或者检查程序的执行情况,那就用第三个按钮,step in,或者在LLDB中使用 thread step in,step,或者 s 命令。...我们会一个个看过来并介绍 LLDB 中等价的命令 (是的,你可以在调试器内部添加断点)。 在 Xcode 的左侧面板,有一组按钮。其中一个看起来像断点。...在这里你可以看到所有的断点 - 在 LLDB 中通过 breakpoint list (或者 br li) 命令也做同样的事儿。

    1.7K70

    使用 LLDB 调试 Go 程序

    但是在IDE中集成比较粗糙,调试也很慢,所以基本不使用debugger进行调试, 最近看到滴滴的工程师分享的使用debugger在调试Go程序,我觉得有必要在尝试一下这方面的技术了。...本文主要介绍应用于glang compiler 工具链的技术, 除了本文的介绍外,你还可以参考 LLDB 手册 介绍 在 Linux、Mac OS X, FreeBSD 或者 NetBSD环境中,当你使用...gc工具链编译和链接Go程序的时候, 编译出的二进制文件会携带DWARFv3调试信息。...gc编译器产生的代码可能会包含内联的优化,这不方便调试器调试,为了禁止内联, 你可以使用-gcflags "-N -l"参数。...1、安装lldb MacOS下如果你安装了XCode,应该已经安装了LLDB, LLDB是XCode默认的调试器。

    2.1K30

    汇编寄存器的规则

    然后你会学到更多关于操作码的知识,并在以后的章节中编写你自己的程序。 注意:在上面的示例中,请注意,在寄存器和常量之前有一堆%和 $。 这就是反汇编程序格式化程序集的展示方式。...但是,一旦函数序言(准备堆栈和寄存器的函数的开始部分)完成执行,这些寄存器中的值就可能改变。生成的程序集可能会覆盖存储在这些寄存器中的值,或者在代码不再需要这些引用时丢弃这些引用。...在 LLDB 控制台中输入以下内容: (lldb) po $rsi 结果你会输出这个 140735181830794 为什么是这样? Objective-C 选择器基本上只是一个 char *。...接下来,在 LLDB 控制台中键入以下内容: (lldb) finish 命令会结束完成函数的执行并停住调试器。这时,函数返回值会在 RAX 内。...使用 continue 命令让调试器继续执行: (lldb) continue 看看 SpringBoard 模拟器程序什么发生了改变。

    2.6K50
    领券