想到一个有趣的问题,为什么 debug 模式可以进断点而 run 模式不行?

2020-11-20 09:50:14 +08:00
 wqgogogo
5239 次点击
所在节点    程序员
39 条回复
magiclx
2020-11-20 10:08:13 +08:00
因为当在 debug 模式下一个断点时,IDE 将断点处程序的二进制替换为了 0xCC,即 INT 3 指令,当程序执行到 INT 3 时,再替换回原指令执行,而 run 模式并未做这个事。
ZSeptember
2020-11-20 10:08:30 +08:00
debug 模式,编译器什么的会给生成的可执行文件加入很多调试相关的信息
Guaidaodl
2020-11-20 10:10:45 +08:00
不同的语言采用的方式略有区别. 建议明确一下语言
LuckyKoala
2020-11-20 10:25:33 +08:00
调试模式运行的时候,会有类似 DWARF 的调试文件生成,包含运行的指令与源文件行号、函数等信息,然后运行的时候会执行 ptrace 类似的函数,如 #1 所说,替换断点处的机器指令,可以查询当时各寄存器的值等信息。

如果有源文件的话,IDE 支持在程序运行之后再把调试器挂载到指定进程。

而普通模式运行的时候是很少与源文件相关的信息,不方便你对着源码去调试。
wqgogogo
2020-11-20 10:39:47 +08:00
@Guaidaodl Java 语言,idea 调试 Java 程序的时候
luckyrayyy
2020-11-20 10:42:35 +08:00
为什么你们连这个都懂...
wqgogogo
2020-11-20 10:45:00 +08:00
@magiclx
@LuckyKoala
这个都完全没接触过,又增加了新的知识点🙇‍
atonku
2020-11-20 10:45:09 +08:00
一拍脑门,为什么我就没想到呢
wqgogogo
2020-11-20 10:48:35 +08:00
@atonku 哈哈,有时候有很多奇怪的想法,过一会就忘了,赶紧发出来分享下 ^_^
msaionyc
2020-11-20 10:57:13 +08:00
因为 run 模式不需要进断点
scar263
2020-11-20 10:58:54 +08:00
楼主你这是想得太多学得太少,建议多看看基础知识的书籍。
ju5t4fun
2020-11-20 11:32:05 +08:00
硬件支持,操作系统提供 api,编译器提供符号,调试器提供功能,想要理解调试的原理需要很多知识
《软件调试》张银奎,这本书很不错,楼主有兴趣的话可以读一下
yangJunKing
2020-11-20 11:36:19 +08:00
GrayXu
2020-11-20 12:48:45 +08:00
正经科班都学过编译原理这门课吧。。
cheng6563
2020-11-20 12:57:14 +08:00
Java 其实就是开了个特殊端口给调试器调用,其他没区别了
warush
2020-11-20 12:58:32 +08:00
@GrayXu 你看看人楼怎么回复的
warush
2020-11-20 12:59:17 +08:00
@GrayXu 言语中暗贬楼主 不正经、非科班 呗
chaleaoch
2020-11-20 13:01:17 +08:00
C 语言的话 GCC 编译参数不一样.
生成的.o 文件也不一样.
譬如 需要将机器码和代码做映射.

另外执行方式也不同. 参考 ptrace.
Team
2020-11-20 13:07:35 +08:00
@warush #17
同意,装的自己很牛,啥信息也没提供.
msg7086
2020-11-20 13:23:24 +08:00
除了加入调试相关信息外,debug 模式通常还会禁用代码优化,保证你写的什么就生成什么。
release 下代码会经过大量优化,有可能你洋洋洒洒写了一大段的计算,最后被优化成一个常量什么的。
像是 C 系的还会做 unroll 或者 vectorize,不关优化的话根本没法调试的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/727396

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX