有人知道SBCL的disassemble中的BREAK指令是什么吗?

28 views
Skip to first unread message

Liutos

unread,
Oct 18, 2019, 11:22:05 AM10/18/19
to lis...@googlegroups.com
如下图
SBCL生成的CLC指令.png
在Google上搜索了一番,没有找到有用的结果,所以来这里求助😂

--
Liutos Love Linux LaTeX Lisp Ling

我的GitHub主页:https://github.com/Liutos

Xiaofeng Yang

unread,
Oct 18, 2019, 5:52:27 PM10/18/19
to lisp-cn
cc是int  3,通常用来设置断点。这里你可以认为是调用异常处理的handler,sbcl这里肯定有专门的handler代码。

这里可以看成是signal一个异常,0f可能是给handler的一个参数,告诉是哪一个异常。break应该就是sbcl发明的一个指令。cc本身是不带参数的。

所以你这里默认会进入自带的debugger。

Liutos <mat.l...@gmail.com> 于 2019年10月18日周五 23:22写道:
--
--
Lisp-cn(Lisp中文用户组)
CLUG https://lisp-cn.com
---
您收到此邮件是因为您订阅了Google网上论坛上的“Lisp-cn(Lisp中文用户组)”群组。
要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到lisp-cn+u...@googlegroups.com
要在网络上查看此讨论,请访问https://groups.google.com/d/msgid/lisp-cn/CAAxQUKbm9yKZiFf1gpg5UkZ1xSc1dAA1vrHHD875OFd6E5%3DOBw%40mail.gmail.com

Liutos

unread,
Oct 20, 2019, 10:10:19 PM10/20/19
to lis...@googlegroups.com
所以 CC0F 是机器码的十六进制表示来着?

我也认为这个是SBCL自己发明的一个指令名称,目的就是为了触发异常(但我没有证据

Xiaofeng Yang <n.akr....@gmail.com> 于2019年10月19日周六 上午5:52写道:

Xiaofeng Yang

unread,
Oct 21, 2019, 12:52:56 AM10/21/19
to lisp-cn
你可以跟踪sigtrap的handler,CC会引发sigtrap。handler可以知道这个cc来自哪里,然后获取第二个字节来知道异常类型。相当于,sbcl自己发明了一个新指令。

你的版本比较老了,最新代码已经从15改成16了。

注意你不能直接用gdb下断点,gdb也是用这个指令来实现断点,替换sbcl的handler(调试器等),导致一执行到CC就跳到了gcc。从断点恢复后,下一个字节开始会被当成指令0f xxx。0f是多字节指令的开头,函数本体又是动态分配的内存,所以运气不好可能会变成执行一个奇奇怪怪的指令。猜测这是从15换成16的原因。原来的15被改成别的了。

Liutos <mat.l...@gmail.com> 于 2019年10月21日周一 10:10写道:

Xiaofeng Yang

unread,
Oct 21, 2019, 12:54:14 AM10/21/19
to lisp-cn
Liutos <mat.l...@gmail.com> 于 2019年10月21日周一 10:10写道:
所以 CC0F 是机器码的十六进制表示来着?

我也认为这个是SBCL自己发明的一个指令名称,目的就是为了触发异常(但我没有证据

证据大概可以源码里搜索“inst break”字符串。

Reply all
Reply to author
Forward
0 new messages