c - 是什么让 GDB 拒绝破解?

标签 c gdb

我在这里不知所措。我正在用 C 编写一个编译器(出于业余爱好),并使用 GDB 7.3 在 amd64 Linux 2.6.32 上使用 GCC 4.6.1 进行编译。标志是“-Wall -Wextra -O0 -g”,除了通常的 -I 和诸如此类的东西。我有一个函数,其目的是报告解析错误,定义如下:

void cerror_at (struct lex *lex, struct token *tok, const char *fmt, ...)

除了可变参数之外,没有什么奇怪的。问题是 GDB 不会中断它。我已经尝试了所有我能想到的方法(函数断点,函数内部,调用之前,你给它命名),但是一旦我的程序在函数内部,我就会收到类似“警告:删除断点错误0"并且 GDB 只是让程序完成。它没有任何问题(我已经修复了我试图找到的错误,并且一切正常运行),但我无法进入该功能。关于什么可能导致这种情况的任何想法?

编辑:更多信息! GDB 将断点设置在 0x403057。该函数从 0x403025 开始。看这部分的反汇编:

0x0000000000403053 <+46>:   test   %al,%al
0x0000000000403055 <+48>:   je     0x403077 <cerror_at+82>

此时,它向前跳到 0x403077(越过断点)。我已经验证将断点放置在“je”之前的地址以及跳转目标 0x403077 或之后的地址,但不在两者之间(GDB 试图放置它的位置)。为什么 GDB 会将断点放在函数的中间?甚至 GDB 都告诉我该函数的地址实际上是 0x403025。

最佳答案

也许我只是太笨了,但我遇到的调试器拒绝中断的最常见原因是最简单的。

  1. 我尝试调试的代码与调试器中的代码不完全匹配。
  2. 我忘了用调试选项编译那个库。

确保在出现此类调试错误时检查这两项,即使您认为这不是问题所在。

关于c - 是什么让 GDB 拒绝破解?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7493601/

相关文章:

c - IDEONE 字符串操作的奇怪输出

c - calloc char 数组与 null 终止符之间的关系

c - 如何在 C 语言的迷你计费系统项目中读取并打印我从用户那里读取的 n 字符串?

linux - 我可以在调试器中跟踪控制流吗?

c - AIX 6.1 : CORE DUMP - GDB "thread apply all bt full" returns NOTHING?

c - 构建 C 代码的技巧/资源?

c - UDP 网络实现的 C 中 send() 和 sendTo() 之间的区别

c - 使用 GDB 进行 Eclipse C/C++ 调试

xcode - 在xcode中学习高级调试技术GDB的提示或资源

c++ - 如何使用 GDB 进入一个函数而不是它的参数