GDB -如何从一开始就进入步进模式
GDB - how to get into stepping mode from the very beginning
通常,要从c++程序执行的最开始进入步进模式,可以在GDB中使用break main
命令。但这只会在main()
函数的入口处中断程序。
如何在第一个用户编写的操作(例如,静态定义类实例的构造函数)上中断程序?
例如,如果我有以下代码,我如何在不使用break 5
命令的情况下中断A()
?
#include <iostream>
struct A {
A() {
std::cout << "A()" << std::endl;
}
};
static A a;
int main() {
return 0;
}
实际上,我调试别人编写的非常大的代码。代码中有许多分散在不同源文件中的静态类实例。在每个构造函数上手动设置断点是不可行的。
可以在构造函数中定义断点。
(gdb) break 'A::A()'
Breakpoint 1 at 0x8048724: file x.cc, line 4.
(gdb) run
Starting program: /.../a.out
Breakpoint 1, A::A (this=0x804a0ce <a>) at x.cc:4
4 std::cout << __func__ << std::endl;
(gdb) bt
#0 A::A (this=0x804a0ce <a>) at x.cc:4
#1 0x08048700 in __static_initialization_and_destruction_0 (__initialize_p=1,
__priority=65535) at x.cc:8
#2 0x0804871c in _GLOBAL__sub_I_main () at x.cc:10
#3 0x080487a2 in __libc_csu_init ()
#4 0xb7d44a1a in __libc_start_main (main=0x80486ad <main()>, argc=1,
argv=0xbffff184, init=0x8048750 <__libc_csu_init>,
fini=0x80487c0 <__libc_csu_fini>, rtld_fini=0xb7fed180 <_dl_fini>,
stack_end=0xbffff17c) at libc-start.c:246
#5 0x080485d1 in _start ()
(gdb)
注意使用单引号来表示标识符是c++编译的。还要注意,堆栈跟踪显示main()
还没有被调用。
从堆栈跟踪中,有许多选择来设置断点,该断点将在任何全局构造函数被调用之前出现。一个这样的断点在_start
上。
(gdb) break _start
Breakpoint 1 at 0x80485b0
(gdb) run
Starting program: /.../a.out
Breakpoint 1, 0x080485b0 in _start ()
(gdb) bt
#0 0x080485b0 in _start ()
(gdb)
相关文章:
- 需要反转音频步进公式
- Arduino Nano:A4988 使用串行输入时通过定时器进行步进控制不稳定
- 锁定步进pthread互斥
- 在 ODEINT 中通过 if 语句选择步进器
- boost odeint 中的受控误差步进器是否支持复杂的数据类型?
- 创建带有限幅器的步进器控件
- 班上的Arduino步进电动机指针不起作用
- 生成最多给定数字 N 的步进数字
- Boost ODEINT:具有自定义类和向量空间代数的受控步进器
- 我如何仅使用一个Arduino uno才能在同一时间和同一方向上旋转两个步进电动机
- 如何使步进电机运行,直到我按下 Arduino 上的特定键盘按钮
- Arduino Sonar和步进马达
- 这些步进回合是否等效
- 使用C++同步控制多个步进器
- 接口 C++ 以使用 Arduino 控制电机步进器
- 步骤程序?开始、结束、步进整数
- 如何使用ODEINT的标签系统为各种步进器类型做特定工作
- 通过替换模板<类步进器来要求>
- GDB 继续而不是步进
- GDB -如何从一开始就进入步进模式