我在这里不知所措。我正在用 C 编写一个编译器(出于爱好),并使用 GDB 7.3 在 amd64 Linux 2.6.32 上使用 GCC 4.6.1 进行编译。除了通常的 -I 等之外,标志还有“-Wall -Wextra -O0 -g”。我有一个函数,其目的是报告解析错误,定义如下:
void cerror_at (struct lex *lex, struct token *tok, const char *fmt, ...)
除了可变性之外,没有什么奇怪的。问题是 GDB 不会突破它。我已经尝试了我能想到的所有方法(在函数处设置断点,在函数内部设置断点,在调用之前设置断点,你可以命名它),但是一旦我的程序位于函数内部,我就会收到诸如“警告:删除断点时出错”之类的消息0”,GDB 只是让程序完成。它不再有任何问题(我已经修复了我试图找到的错误,并且一切都按预期运行),但我无法进入该函数。关于什么可能导致这种情况的任何想法?
Edit:更多信息! GDB 在 0x403057 设置断点。该函数从 0x403025 开始。看这部分的拆解:
0x0000000000403053 <+46>: test %al,%al
0x0000000000403055 <+48>: je 0x403077 <cerror_at+82>
此时,它向前跳到 0x403077(经过断点)。我已经验证将断点放置在“je”之前的地址以及跳转目标 0x403077 或之后的地址处,但不在中间(GDB 试图放置它的位置)。为什么GDB要把断点放在函数中间呢?甚至 GDB 也告诉我该函数的地址实际上是 0x403025。
也许我只是愚钝,但我遇到的调试器拒绝中断的最常见原因是最简单的。
- 我尝试调试的代码与调试器中的代码不完全匹配。
- 我忘记用调试选项编译该库。
每当出现这样的调试错误时,请务必检查这两项,即使您认为这不是问题所在。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)