2011-07-21 25 views
12

Tôi đang cố gắng gỡ lỗi chương trình không có sẵn mã nguồn và tôi cần xem những gì nó đã lưu trữ trong chuỗi std ::. Tôi đã và đang tìm kiếm ở đây, và tôi đã tìm thấy một số thông tin về việc xuất các container STL, nhưng tất cả đều đề cập đến các biến, không có nguồn hoặc thông tin gỡ lỗi tất cả những gì tôi có là bộ nhớ bù của dữ liệu lớp. Có cách nào để làm điều này không?Làm thế nào để kiểm tra std :: string trong GDB mà không có mã nguồn?

Trả lời

22

Mọi hoạt động std::string đều có con trỏ đến các ký tự thô trong đó ở đâu đó. Đối với g++ 4.x, con trỏ đó ở mức bù đắp 0 vào chuỗi.

Nếu bạn biết rằng chuỗi nằm ở ví dụ: 0x7fffffffda88, sau đó

print *(char**)0x7fffffffda88 

là những gì bạn cần.

+0

Cảm ơn bạn, mà làm việc. Một điều tôi muốn biết là làm thế nào tôi sẽ tìm một cái gì đó như thế ra bản thân mình. tức là đã cung cấp mã nguồn cho lớp 'X' làm cách nào để tôi tìm ra vị trí của các trường trong lớp đó? Cách duy nhất tôi có thể nghĩ đến vào lúc này là biên dịch ứng dụng thử nghiệm của riêng tôi và kiểm tra các con trỏ tôi được đưa ra (với offsetof, v.v.). – PeterBelm

+1

Cách nhanh nhất để tìm ra bù đắp trên thực tế là biên dịch một chương trình thử nghiệm tầm thường bằng cách sử dụng lớp đã cho trong chế độ gỡ lỗi và kiểm tra bố cục và bố cục lớp trong GDB. Đó là chính xác những gì tôi đã làm để trả lời câu hỏi của bạn ;-) –

+2

Như một sang một bên, nếu SSO được sử dụng như trong libC++ của clang, không có con trỏ như vậy cho các chuỗi nhỏ. ;-) – Deduplicator

5

Có lẽ lựa chọn đơn giản nhất là sử dụng phương pháp c_str, như trong:

print myStr.c_str() 
Các vấn đề liên quan