2011-07-21 67 views
12

我想調試一個沒有可用源代碼的程序,我需要看看它存儲在std :: string中的內容。我一直在谷歌搜索和看這裏,我已經找到了一些關於輸出STL容器的信息,但它都是指變量,沒有源或調試信息,我擁有的是類數據的內存偏移量。有沒有辦法做到這一點?如何檢查GDB中的std :: string沒有源代碼?

回答

22

std::string實現有一個指向其中的原始字符的指針。對於g++ 4.x,該指針在偏移量0處插入字符串。

如果您知道該字符串駐留在例如0x7fffffffda88,然後

print *(char**)0x7fffffffda88 

是你需要的。

+0

謝謝你,這工作。我想知道的一件事是我如何在自己身上找到類似的東西。即給出類「X」的源代碼,我怎麼才能找出該類中的字段的位置?我現在能想到的唯一方法是編譯我自己的測試應用程序,並檢查我給出的指針(使用offsetof等)。 – PeterBelm

+1

找出偏移量的最快方法實際上是在調試模式下使用給定的類編譯一個簡單的測試程序,並檢查GDB中的偏移量和類佈局。這正是我所做的回答你的問題;-) –

+2

另外,如果像clang的libC++一樣使用SSO,那麼對於小字符串就沒有這樣的指針。 ;-) – Deduplicator

5

也許最簡單的方法是使用c_str方法,如:

print myStr.c_str()