[英]How do I prevent the compiler from omitting types I don't explicitly instantiate?
這是一個關於調試的問題。 我已經為標准庫安裝了GDB漂亮的打印機,但我發現它們在許多情況下都無法正常工作。 例如,使用以下聲明調試一段代碼:
std::map<int, int> foo;
我已經用-O0 -ggdb3
編譯了,所以我希望在檢查foo
沒有問題,如果我手動檢查結構,我沒有遇到任何問題。 但是,STL漂亮的打印機不起作用,因為GCC似乎忽略了我的程序沒有顯式實例化的嵌套類型的類型信息。
例如,如果我在GDB中運行以下命令:
p foo.begin()
我看到以下錯誤消息:
Python Exception <class 'gdb.error'> No type named
std::_Rb_tree_iterator<std::pair<int const, int> >::_Link_type.
這個缺少的typename是一個內部typedef,在std::map::iterator
定義。 它是依賴於實現的標准庫支持代碼,因此它不是跨平台的(甚至保證在同一平台上的不同版本的實現之間繼續存在)。
但是,如果我在程序中聲明涉及該類型的內容,那么漂亮的打印機將正常工作。
std::_Rb_tree_iterator<std::pair<int const, int> >
::_Link_type *dummy = NULL;
那么,我如何指示GCC不要在這種情況下刪除類型的定義,以便它們仍可供調試器使用? 鑒於STL實現不是跨平台的,一個hacky解決方法就像使用預處理器宏聲明一堆虛擬變量似乎不是一個可擴展的解決方案。 是否有一個標志我可以傳遞給GCC強制遞歸包含模板類型? 或者GCC根本不支持這個? 還有其他人遇到過這個問題並解決了嗎?
作者注
GDB 7.7.1(截至本文撰寫時ubuntu 14.04 repos中的最新版本)打破了GDB漂亮打印,無法正確打印指針。 那些想要回答這個問題的人可能會發現知道這是一個已知問題並且已經提交了一個錯誤。
那么,我如何指示GCC不要在這種情況下刪除類型的定義,以便它們仍可供調試器使用?
我不相信有任何方法可以指示GCC為程序中不存在的類型發出調試信息。
然而,它是一個非常奇怪的程序,它實例化std::map
,但從不使用任何迭代器使用方法。
如果我在程序中聲明涉及該類型的內容
應該沒有必要這樣做。 簡單地調用m.begin()
或具有范圍for
在程序中的地圖上環某處是足夠來實例化迭代器類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.