- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我经常看到以 lr
指针终止的 ARM 堆栈跟踪(阅读:Android NDK 堆栈跟踪),如下所示:
#00 pc 001c6c20 /data/data/com.audia.dev.qt/lib/libQtGui.so
#01 lr 80a356cc /data/data/com.audia.dev.rta/lib/librta.so
我知道 lr
在 ARM 和其他架构上代表 link register
,这是一种存储返回地址的快速方法,但我不明白为什么它似乎总是存储一个无用的地址。在此示例中,80a356cc
无法使用 addr2line
或 gdb
映射到任何代码。
有什么办法可以得到更多的信息吗?为什么跟踪必须停在 lr
地址?
最佳答案
终于找到答案了。我只需要更加细心。查看以下简短堆栈跟踪及其后的信息:
#00 pc 000099d6 /system/lib/libandroid.so
#01 lr 80b6c17c /data/data/com.audia.dev.rta/lib/librta.so
code around pc:
a9d899b4 bf00bd0e 2102b507 aa016d43 28004798
a9d899c4 9801bfa8 bf00bd0e 460eb573 93004615
a9d899d4 6d842105 462b4632 200047a0 bf00bd7c
a9d899e4 b100b510 f7fe3808 2800edf4 f04fbf14
a9d899f4 200030ff bf00bd10 b097b5f0 4614af01
code around lr:
80b6c15c e51b3078 e5933038 e5932024 e51b302c
80b6c16c e1a00002 e3a01000 e3a02000 ebfeee5c
80b6c17c e1a03000 e50b303c e51b303c e1a03fa3
80b6c18c e6ef3073 e3530000 0a000005 e59f34fc
80b6c19c e08f3003 e1a00003 e51b103c ebfeebe6
现在 lr
地址仍然是一个对我们没有用的 80xxxxxx
地址。
它从 pc
打印的地址是 000099d6
,但请看下一节,code around pc
。第一列是地址列表(您可以从它每次递增 16 的事实中看出。)这些地址都不像 pc
地址,除非您砍掉前 16 位。然后你会注意到 a9d899d4
必须对应于 000099d4
,程序停止的代码是从那里开始的两个字节。
Android 的堆栈跟踪似乎已经为我“截断”了 pc
地址的前 2 个字节,但无论出于何种原因,它都没有对叶寄存器中的地址执行此操作。这给我们带来了解决方案:
简而言之,我能够从 80b6c17c
地址砍掉前 16 位,使其成为 0000c17c
,到目前为止每次我可以使用 gdb
或 addr2line
查找时,都给了我一个有效的代码地址。 (编辑:我发现它实际上通常是前 12 位 或前 3 个十六进制数字。您可以通过查看自己来决定堆栈跟踪输出就像我上面描述的那样。)我可以确认它也是正确的代码地址。这无疑使调试变得更加容易!
关于c++ - 堆栈跟踪在叶寄存器 (lr) 处停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6460094/
我对以下内容感到困惑quote来自维基百科: In other words, if a language was reasonable enough to allow an efficient one
我正在努力研究解析器理论,但我一直在不同的来源中找到相同的示例。语法大致如下(简化): E = T E = E + T T = 0..9 所以假设字符串 2 + 2 将被这样解析(“|”将堆栈与提醒分
PUSH{lr}的等效指令是什么?和 POP{lr}在 ARM Arch64 指令集中。 是 STR X30, [SP, #8]正确的 ?你能解释一下保持堆栈对齐的概念吗?我对 ARMv8 比较陌生,
是否有一个很好的在线资源,其中包含一些主要解析算法(LL(1)、LR(1)、LR(0)、LALR(1))的语法集合?我发现了许多属于这些家族的单独语法,但据我所知,没有什么好的资源可以让人编写大量示例
我使用IAR编译例程,但在ARM A7上运行错误;然后当我打开 IAR 生成的 .lst 文件时,我得到了以下问题。 它是一个ISR,首先push {r3, r4, r5, lr},但是POP {r0
我想知道 LR 属性解析器可以做什么以及它是如何实现的。 yacc 生成的解析器允许在属性源是使用 $0、$-1 等规范语法位于左侧的兄弟时继承属性。使用 S -> A B B 将能够从 A 继承一个
我想使用“merc_timer_handle_t”来记录loadrunner中的时间,但是当我创建场景时,LR给出错误消息:“第15行靠近“MasterT”的语法错误” . 我想知道如何使用“merc
我正在使用 ray RLlib 库在 5 排游戏中训练多智能体训练器。这是零和环境,所以我有代理人行为退化的问题(总是赢得第一个代理人,5 步获胜)。我有一个想法以这种方式改变代理人的学习率:首先训练
我是 Graphviz 的新手,尝试使用如下所示从左到右布局一些节点: digraph g { graph [ rankdir = "LR" ]; node [ fontsize = "16", f
LR(1) 解析器可以解析这种类型的语法吗? S -> SA | A A -> aSb | ab 我正在尝试编写一个实现此类解析器的 Java 程序,但我只能在没有左递归的语法上获得正确的结果。 最
从历史上看,LALR(1) 解析器比 LR(1) 解析器更受青睐,因为 LR(1) 解析器生成的大量状态需要资源。很难相信这仍然是当今计算环境中的一个问题。情况仍然如此,还是现代编译器现在使用规范的
我是编译主题的新手,刚刚开始自下而上解析的练习。 我一直坚持以下问题。 为以下文法建立一个LR(0)解析表: 1) E –> E + T 2) E –> T 3) T –> (E) 4) T –> i
我有一个我无法解决的 LR(1) 冲突语法;然而,语法应该是明确的。我将首先使用五个标记在简化语法上演示问题:(, ), {}, , 和 id。 EBNF 看起来像这样: args = (
假设 G(增强语法): E' - > E E - > E+T|T T - > T*F|F F - > (E)|id 因此,在 dfa 的创建级别之一中,我已经达到了这一点:(龙书中的 I6)
我经常看到以 lr 指针终止的 ARM 堆栈跟踪(阅读:Android NDK 堆栈跟踪),如下所示: #00 pc 001c6c20 /data/data/com.audia.dev
我使用的是 ARM Cortex-M4 处理器。据我了解,LR(链接寄存器)存储当前执行函数的返回地址。但是,内联和/或裸函数会影响它吗? 我正在努力实现简单的多任务处理。我想写一些代码来保存执行上下
我正在尝试为一种将用于生成其他文件的模板(配置)文件构建一个简单的 LR 解析器。我已经阅读和阅读了有关 LR 解析器的信息,但我似乎无法理解它!我知道有一个解析栈,一个状态栈和一个解析表。 toke
我在理解LR(1)-项目中的超前原理方面遇到困难。如何计算超前集? 例如,我有以下语法: S -> AB A -> aAb | b B -> d 然后,第一个状态将如下所示: S -> .AB , {
我正在学习“Engineering a Compiler, 2nd Edition”。我知道什么是LR(1)文法,但我在这本书中找不到运算符优先文法。 然后我从图书馆借了《编译器——原理、技术和工具》
我至少读过十几遍维基百科的解释,但我仍然对 LR(0) 解析器如何离开状态 0 感到困惑。 Wikipedia's example, with its explanation, says : The
我是一名优秀的程序员,十分优秀!