我有一個C++對象,它有20個構造函數,我想知道哪個特定的構造函數被調用。如何在gdb的所有構造函數中爲C++對象同時設置斷點?
回答
您可以使用rbreak
。見documentation:
rbreak regex
Set breakpoints on all functions matching the regular expression regex. This command sets an unconditional breakpoint on all matches, printing a list of all breakpoints it set. Once these breakpoints are set, they are treated just like the breakpoints set with the break command. You can delete them, disable them, or make them conditional the same way as any other breakpoint.
例子:
class Foo {
public:
Foo() {}
Foo(int) {}
};
int main() {
Foo f1;
Foo f2(1);
return 0;
}
GDB會話:
[ ~]$ gdb -q a.out
Reading symbols from a.out...done.
(gdb) rbreak Foo::Foo
Breakpoint 1 at 0x4004dc: file so-rbr.cpp, line 3.
void Foo::Foo();
Breakpoint 2 at 0x4004eb: file so-rbr.cpp, line 4.
void Foo::Foo(int);
(gdb) i b
Num Type Disp Enb Address What
1 breakpoint keep y 0x00000000004004dc in Foo::Foo() at so-rbr.cpp:3
2 breakpoint keep y 0x00000000004004eb in Foo::Foo(int) at so-rbr.cpp:4
(gdb)
只要運行break myNamespace::myClass::myClass
,gdb就會在每個構造函數中斷開。
例如,如果您想要創建任何具有至少2個構造函數的runtime_error,您可以運行break std::runtime_error::runtime_error
。 gdb輸出將如下所示:
Breakpoint 4 at 0xaf20 (4 locations)
這表明斷點設置爲多個構造函數。要檢查運行info breakpoints
將提供輸出這樣的斷點的位置:
Num Type Disp Enb Address What
1 breakpoint keep y <MULTIPLE>
1.1 y 0x000000000000af20 <std::runtime_error::runtime_error(char const*)@plt>
1.2 y 0x000000000000b300 <std::runtime_error::runtime_error(std::runtime_error const&)@plt>
1.3 y 0x000000000000b460 <std::runtime_error::runtime_error(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@plt>
1.4 y 0x000000000000b5e0 <std::runtime_error::runtime_error(char const*)@plt>
由於某種原因,我得到斷點上只有一個構造函數中斷std :: runtime_error :: runtime_error – avimonk
您是否運行過'break std :: runtime_error :: runtime_error'或'break std :: runtime_error :: runtime_error()'? – OutOfBound
b std :: runtime_error :: runtime_error。只需複製粘貼你的。也許一些舊的gdb版本或代碼沒有在調試中編譯? – avimonk
- 1. gdb,在文件中的所有函數上設置斷點
- 2. 如何在gdb中爲C++設置operator()的斷點?
- 3. 在C文件中設置GDB斷點
- 4. 如何使用共享庫函數在gdb中設置斷點
- 5. 如何使用構造函數將對象設置爲現有對象?
- 6. GDB在對象函數調用中斷
- 7. 在共享對象文件中設置gdb斷點
- 8. 如何一次調用同一構造函數中的所有對象?
- 9. 我可以在我的代碼中爲所有類的構造函數設置斷點嗎?
- 10. 如何在Windbg的析構函數中設置斷點?
- 11. gdb:如何確認函數上設置了斷點?
- 12. 對象構造函數的C++數組
- 13. 成員函數的C++ GDB斷點
- 14. 在C#抽象中設置構造函數
- 15. php對象在構造函數中定義和設置屬性
- 16. GDB無法設置斷點
- 17. 如何在函數啓動時設置爲斷點?
- 18. 當在js模塊中定義對象構造函數時,從C調用JS對象構造函數
- 19. JavaScript對象構造函數設置爲undefined
- 20. 如何在Visual Studio中爲c#文件中的所有行設置斷點?
- 21. 當數組值在cuda-gdb中更改時設置斷點
- 22. 我們可以中斷在構造函數中創建對象
- 23. 爲什麼同時使用params和多對象構造函數?
- 24. Angular - 在構造函數中設置屬性時無法解析所有參數
- 25. 如何在構造函數中調用承諾對象以設置屬性
- 26. 如何搜索C++代碼中的所有構造函數?
- 27. 爲什麼F#泛型類型推斷在構造函數上有所不同?
- 28. gdb:如何在帶空格的文件中設置斷點
- 29. 如何從構造函數中返回構造函數的對象
- 30. C++對象創建和構造函數
如果你有很多的構造函數,我會說你的設計是有缺陷的。或者你的設計的實現是。 –
爲什麼你不能使用's'命令進入ctor? – dlmeetei
你應該能夠找出從調用代碼中調用哪個構造函數。如果你仍然想設置一個斷點,那麼你可以從所有20個構造函數中調用一些虛擬方法,並在那裏設置一個斷點。 – VTT