- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
上下文:我正在为另一个平台编写解释器,这意味着我的程序通常会从任意整数数据加载指针。当涉及到分支时,我尝试取消引用以立即读取下一条指令的地址,这样如果地址无效,我就会在分支指令的方法内得到段错误,而不是稍后。这应该会使调试更容易。
但是,这并不像我希望的那样有帮助。当在那里发生段错误时,它应该是完全可恢复的,因为它是由虚拟读取触发的,所以我希望能够将程序的指令指针移回方法的开头并重置段错误。
我可以告诉 LLDB 忽略已经进入我的程序的 SIGSEGV
吗?我知道我可以使用进程句柄...
来决定哪些信号进入我的程序,但这不适用于进程当前正在处理(或者更确切地说不处理)的信号。
(如果不可能,我想我仍然可以要求 lldb 停止出现段错误而不将它们传递给程序,但我至少想知道是否可能.)
最佳答案
我认为您正在尝试解决EXC_BAD_ACCESS
以正确放置它。例如,听起来您正在这个示例程序中描述 dataptr
#include <stdio.h>
int main ()
{
void (*funcptr)(void) = 0;
int *dataptr = 0;
puts ("about to deref dataptr");
printf ("%d\n", *dataptr);
puts ("about to call through f ptr");
funcptr();
puts ("done");
return 0;
}
您将在 printf
调用中的 dataptr
取消引用中遇到第一个 EXC_BAD_ACCESS。您可以将变量更改为有效值以继续执行。这里的一个技巧是,在我的 -O0
编译示例中,变量 dataptr
位于堆栈中,因此您需要设置 register ,即此时正在阅读以克服它。这里我只是使用main()
的起始地址作为本程序中的有效地址作为一个简单的例子。
* thread #1: tid = 0x1f03, 0x0000000100000eb6 a.out`main + 54 at a.c:7, stop reason = EXC_BAD_ACCESS (code=1, address=0x0)
-> 7 printf ("%d\n", *dataptr);
(lldb) disass -c 1 --pc
a.out`main + 54 at a.c:7:
-> 0x100000eb6: movl (%rcx), %esi
(lldb) reg read rcx
rcx = 0x0000000000000000
(lldb) p dataptr
(int *) $0 = 0x0000000000000000
(lldb) p dataptr = (int*) main
(int *) $1 = 0x0000000100000e80
(lldb) reg write rcx `$1`
(lldb) c
Process 77491 resuming
-443987883
about to call through f ptr
* thread #1: tid = 0x1f03, 0x0000000000000000, stop reason = EXC_BAD_ACCESS (code=1, address=0x0)
#0: 0x0000000000000000
现在我停止了,因为我通过 NULL 函数指针调用。展开这一过程需要一点额外的 x86_64 ABI 知识,但这并不是那么困难——将 pc 设置为调用者的返回地址,将堆栈弹出一个字,然后就可以回来了。
(lldb) reg write pc `*(unsigned long long *)$sp`
(lldb) reg write sp `$sp + 8`
(lldb) c
Process 77522 resuming
done
Process 77522 exited with status = 0 (0x00000000)
当然,这是非常手动的调整 - 不太容易自动化。您可以使用 python 函数表达空函数指针 deref 并添加 lldb 命令来轻松完成此操作,但是空数据指针 deref 要求您知道正在访问哪个寄存器 - 也许反汇编指令的一些巧妙的模式匹配可以做到这一点对于常见情况,一些 python 扩展也是如此。
希望有帮助。
关于debugging - 如何告诉 LLDB 在段错误后继续?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13323461/
我正在尝试使用 lldb 远程启动和调试新进程没有太大的成功。 通过运行以下命令附加到已启动的进程效果很好: process connect process attach -P gdb-remote
如果我针对给定主题调用 lldb 帮助,大部分内容都会从屏幕上消失。例子: (lldb) help expression 我可以退出调试器,并在 typescript 中收集帮助,但这很笨拙。 lld
在 lldb 中有没有办法继续直到循环结束?我正在寻找 finish 的类似物,但它不是跳出堆栈帧,而是跳出循环。 for (int i = 0; i < 10000000; i++) { .
我已阅读 this tutorial ,但我还没有发现任何有关反向调试的信息。 lldb 是否有一些功能,例如 target record在 gdb 中?如果是,我在哪里可以阅读它? 最佳答案 还没有
lldb 是否具有 gdb 的等效项 shell命令从提示符运行外部命令? (见 How can I execute external commands from the gdb command pr
LLDB 有 convenience variables ?如果是这样,我该如何使用它们?如果没有,我可以使用类似的东西吗? 引用:http://software.intel.com/sites/pr
有没有办法使用 lldb 调试器设置零标志? 类似 gdb 中的 set ($eflags)=似乎只有 register write rflags ... 来设置所有 最佳答案 这是在 lldb 中设
有没有办法使用 lldb 调试器设置零标志? 类似 gdb 中的 set ($eflags)=似乎只有 register write rflags ... 来设置所有 最佳答案 这是在 lldb 中设
我正在使用 lldb 来跟踪调用 CoreFoundation 函数(例如 CFRunLoopTimerCreate)的一些纯 C 或 C++ 代码(32 位)。 我在 CFRunLoopTimerC
我在 lldb 中为我在 MacOS 上安装的基于 C 语言的应用程序设置了很多断点。断点大多设置在应用程序的同一函数中。然而,第二天我回到应用程序继续工作,我又开始在同一个函数中设置断点,出现了一个
您最喜欢的打印 NSArray 内容的方式是什么?使用LLDB? 一个python脚本? 内联 for 循环? 一个Objective-C 方法调用? 我知道按索引打印对象很容易。我想一次打印所有对象
我想从脚本中运行类似以下命令的内容: lldb -f /path/to/my/file -o command1 -o command2 ... -o detach 有没有办法在执行后退出lldb而不进
众所周知,我们可以在 GDB 中使用命令“catch syscall”来中断每个系统函数。 LLDB 中是否有类似的命令? (gdb) catch syscall Catchpoint 1 (sysc
使用 Xcode 10,当我使用断点停止我的应用程序并尝试在控制台中打印对象的内容时,我获得: "Couldn't IRGen expression, no additional error" 但是,
由于这些天在 Mac 上使用 gdb 变得越来越困难(至少我觉得我正在与 Apple 进行艰苦的斗争),所以我开始尝试使用 lldb。 是否有与 gdb -tui 等效的模式,可以显示源代码的良好、持
使用 Xcode 10,当我使用断点停止我的应用程序并尝试在控制台中打印对象的内容时,我得到: "Couldn't IRGen expression, no additional error" 但是,
$cat testleak01.cpp #include int main() { int*p=new int[3]; return 0; } 用调试信息编译它 $g++ testle
如何检查LLDB中不同线程中运行和步进的线程数? GDB 有信息线程。 LLDB 有类似的命令吗? 最佳答案 跑过: (lldb) help thread 命令来看看你可以用 lldb 中的线程做什么
我正在运行 Xubuntu 16.04。从存储库安装 lldb 后,当我尝试使用它时,我得到以下输出: lldb foo (lldb) target create "foo" Current exec
我目前正在为 C++ 中的自定义对象开发绘图命令。我正在使用 Xcode v10.1。 我使用command script import test.py 导入我自己的命令,其中有一个函数如下: imp
我是一名优秀的程序员,十分优秀!