可以检查与对不同类成员的调用、对给定类任何成员的调用或对重载的顶级函数的调用有关的问题。可以将关键字 inmember、inclass、infunction 或 inobject 与 stop、when 或 trace 命令一起使用,在 C++ 代码中设置多个断点。
要在特定成员函数的每个类特定变体(成员函数名相同,类不同)中设置断点,请使用 stop inmember。
例如,如果在几个不同的类中定义了函数 draw,要在每个函数中设置断点,请键入:
(dbx) stop inmember draw
有关指定 inmember 或 inmethod 事件的更多信息,请参见inmember 事件规范。
要在特定类的所有成员函数中设置断点,请使用 stop inclass 命令。
缺省情况下,断点只插入类中定义的类成员函数中,而不会插入可能从基类继承的类成员函数中。如果还要在从基类继承的函数中插入断点,请指定 -recurse 选项。
以下命令可在类 shape 中定义的所有成员函数中设置断点:
(dbx) stop inclass shape
以下命令可在类中定义的所有成员函数中以及从该类继承的函数中设置断点:
(dbx) stop inclass shape -recurse
有关指定 inclass 事件的更多信息,请参见inclass 事件规范 和stop 命令。
由于 stop inclass 和其他断点选择可能会插入大量断点,因此应确保将 dbxenv 变量 step_events 设置为 on 以加快 step 和 next 命令的执行速度。有关更多信息,请参见效率考虑事项。
要在具有重载名称(名称相同、参数的类型或数量不同)的非成员函数中设置多个断点,请使用 stop infunction 命令。
例如,如果 C++ 程序定义了两个名为 sort() 的函数版本(一个传递 int 类型参数,另一个传递 float 类型参数),以下命令将会在这两个函数中设置断点:
(dbx) stop infunction sort
有关指定 infunction 事件的更多信息,请参见infunction 事件规范。
可以设置 In Object 断点来检查应用于特定对象实例的操作。
使用 In Object 断点在对特定对象实例调用任何方法时停止程序执行。例如,以下代码仅在调用 f1->printit() 时导致停止:
Foo *f1 = new Foo(); Foo *f2 = new Foo(); f1->printit(); f2->printit(); (dbx) stop inobject f1
f1 中存储的地址将标识您在其中放置断点的对象。这表示只能在 f1 中的对象实例化之后创建此断点。
缺省情况下,In Object 断点会在对象的类(包括继承的类)的所有非静态成员函数中暂停程序执行。要将断点局限于对象类,请指定 -norecurse 选项。
要在对象 foo 的基类中定义的所有非静态成员函数中以及在对象 foo 的继承类中定义的所有非静态成员函数中设置断点:
(dbx) stop inobject &foo
要在对象 foo 的类中定义的所有非静态成员函数中设置断点,但不在对象 foo 的继承类中定义的所有非静态成员函数中设置断点:
(dbx) stop inobject &foo -norecurse
有关指定 inobject 事件的更多信息,请参见inobject 事件规范 和stop 命令。