我使用了两个不同版本的GDB,都在以下代码中提出了问题:
修剪MyFile.h
中的代码:
template<class T>
struct ABC: PQR<T> {
void flow(PP pp) {
const QX qx = XYZ<Z>::foo(pp); // Trying to set a breakpoint here, line no. 2533
ASSERTp(qx >= last_qx());
}
}
GDB 7.1:
Reading symbols from /path_to_exec/exec...done.
(gdb) break MyFile.h:2533
Note: breakpoint 1 also set at pc 0x121.
Note: breakpoint 1 also set at pc 0x121.
Note: breakpoint 1 also set at pc 0x121.
Note: breakpoint 1 also set at pc 0x156.
Note: breakpoint 1 also set at pc 0x156.
Note: breakpoint 1 also set at pc 0x121.
Note: breakpoint 1 also set at pc 0x121.
Note: breakpoint 1 also set at pc 0x121.
Note: breakpoint 1 also set at pc 0x121.
Note: breakpoint 1 also set at pc 0x121.
Note: breakpoint 1 also set at pc 0x121.
Note: breakpoint 1 also set at pc 0x156.
Note: breakpoint 1 also set at pc 0x156.
Note: breakpoint 1 also set at pc 0x121.
Breakpoint 1 at 0x44e5c4: file PacketEngine.h, line 2533. (23 locations)
(gdb) run
Starting program: /path_to_exec/exec -options
Warning:
Cannot insert breakpoint 1.
Error accessing memory address 0x121: Input/output error.
Cannot insert breakpoint 1.
Error accessing memory address 0x156: Input/output error.
为什么要为一个设置23个断点?更进一步,它在run
GDB 6.3:
This GDB was configured as "x86_64-redhat-linux-gnu"...Using host libthread_db library "/lib64/tls/libthread_db.so.1".
(gdb) break MyFile.h:2533
No line 2533 in file "MyFile.h".
在程序开始时,它甚至不接受断点
如果我打破功能ASSERTp,它会中断。然后。如果我去“UP”,并输入break,它会成功插入断点(break MyFile.h:2533
)。 [因此它以某种方式在程序实际运行后找到文件/行]。 然而,尽管设置了断点,但在重新运行程序时,它不会在第2533行停止,而只在2534停止(函数ASSERTp中的断点)。
我的问题:
1)有人可以帮我解决一下吗?
2)我经常遇到模板代码和GDB的问题。有什么好的&amp;模板的免费C ++调试器?
3)不是很重要,但如果重要的是一个附带问题:哪个版本更可取? 7.1似乎有更多的错误,但我记得在一些运行中,它提供的问题较少。
系统信息:
uname -a
Linux ... 2.6.9-67.ELsmp #1 SMP Fri Nov 16 12:49:06 EST 2007 x86_64 x86_64 x86_64 GNU/Linux
file /usr/bin/gdb #### GDB 6.3
/usr/bin/gdb: ELF 64-bit LSB executable, AMD x86-64, version 1 (SYSV), for GNU/Linux 2.4.0, dynamically linked (uses shared libs), stripped
file ~/local/bin/gdb #### GDB 7.1
/home/user/local/bin/gdb: ELF 64-bit LSB executable, AMD x86-64, version 1 (SYSV), for GNU/Linux 2.4.0, dynamically linked (uses shared libs), not stripped
file /path_to_exec/exec
/path_to_exec/exec: ELF 64-bit LSB executable, AMD x86-64, version 1 (SYSV), for GNU/Linux 2.4.0, dynamically linked (uses shared libs), not stripped
答案 0 :(得分:0)
我不是Linux的任何其他调试器,但我从未遇到过你解释过的问题。
你的问题非常好(所以你可能已经这么做了),但你是否用调试符号编译了你的来源?
修改强>
btw我没有尝试过gdb 7.1 - 只有6.8版本。如果您认为它非常错误,请尝试使用6版本的最新版本。
答案 1 :(得分:0)
我见过类似的东西(使用GDB 7.0),其中模板函数中设置的断点永远不会被击中。
我们的项目是使用旧版本的G ++构建的(比我的发行版中提供的版本早得多)。我发现通过使用相同的编译器构建一个GDB版本,我们开发了问题就解决了。
答案 2 :(得分:0)
gdb为每个实例化模板设置一个不同的断点,即程序中T(也许是Z)假定的每个不同类型。但是,它尝试在0x121设置断点的地址似乎太低,可能对应于某些系统位置。这可能是gdb无法设置断点的原因。
你应该试试gdb 7.2,也许这会有所帮助。
此外,e2dbg是Linux的一种不同类型的调试器,但它并不像gdb那样成熟。 http://www.eresi-project.org/wiki/TheEmbeddedELFDebugger