2010-07-26 22 views
7

Tôi có một con trỏ trong GDB, làm thế nào tôi có thể tìm ra nơi nó được phân bổ lần đầu tiên trên heap?Trong GDB, làm thế nào để tìm ra ai đã mua một địa chỉ trên heap?

Trong WinDBG, điều này có thể được thực hiện bằng !heap -p -a <0x12345678> sau khi bật gflags /i <*exe> +ust

Kể từ Valgrind có thể cho tôi biết nơi bộ nhớ được phân bổ (khi nó phát hiện một số rò rỉ), tôi đoán đây cũng là có thể?

(Điều này là không về watchpoint. Đây được cho tình huống mà tôi ngẫu nhiên đột nhập vào Trong GDB, ứng dụng, hãy nhìn vào một con trỏ và muốn biết "những người tạo ra tác phẩm này của bộ nhớ"?)


Sử dụng gỡ lỗi ngược trong GDB là một cách rất mới và có lẽ cách chính xác cách để giải quyết vấn đề này. Tôi gặp phải một số vấn đề với cách tiếp cận đó với GDB 7.1 - phiên bản ổn định mới nhất. Đảo ngược gỡ lỗi là một tính năng khá mới trong GDB vì vậy tôi cần phải kiểm tra HEAD (7.2) để sửa chữa nó.

Nó có thể nói điều gì đó về sự trưởng thành của cách tiếp cận GDB nhưng tôi nghĩ rằng nó chắc chắn nên được sử dụng khi nó trưởng thành hơn. (Tính năng tuyệt vời!)

Trả lời

3

Valgrind hijacks gọi quản lý bộ nhớ, đó là cách hoạt động của bộ kiểm soát heap. Không có cơ sở nào trong GDB tự cho bạn biết địa chỉ đã cho được trả về bởi malloc(3). Tôi khuyên bạn nên xem xét mtraceglibc allocation debugging.

+0

Cảm ơn! Cả hai cách tiếp cận của bạn và ks1322 có vẻ hợp lệ. Đó là sâu sắc để biết về mtrace và gỡ lỗi phân bổ glib. Mặt khác, tôi cảm thấy cách tiếp cận của ks1332 thông minh hơn và có lẽ gần gũi hơn với GDB (như vậy là tiêu đề câu hỏi). Tôi sẽ thử nghiệm với cả hai và xem cái nào tốt hơn trong thực tế trước khi chọn một câu trả lời đúng. – kizzx2

6

Có thể reverse debugging sẽ trợ giúp tại đây. Cố gắng đặt điểm quan sát trên địa chỉ bộ nhớ và đảo ngược tiếp tục cho đến khi ghi nhớ.

(gdb) watch *0x12345678 
(gdb) reverse-continue 
+0

Cảm ơn! Cả hai cách tiếp cận của bạn và Nikolai có vẻ hợp lệ. Cách tiếp cận của bạn thông minh hơn và có lẽ gần gũi hơn với GDB (do đó là tiêu đề câu hỏi). Mặt khác, nó là sâu sắc để biết về mtrace và gỡ lỗi phân bổ glib. Tôi sẽ thử nghiệm với cả hai và xem cái nào tốt hơn trong thực tế trước khi chọn một câu trả lời đúng. – kizzx2

+0

Vâng, đây là niềm vui, nhưng tôi không nghĩ rằng nó thực tế khác hơn cho các chương trình rất nhỏ (thậm chí không bao giờ tâm đa luồng). –

+0

@Nikolai: có vẻ như đó là sự thật. Trong khi đảo ngược gỡ lỗi thực sự thú vị từ quan điểm kỹ thuật, nó có thể không đủ trưởng thành trong nhiều trường hợp. Một showstopper là 'record' nó sẽ * không * chạy trong một chương trình Hello World, bởi vì nó từ chối ghi lại bất kỳ IO (TTY, hệ thống tập tin, vv). Điều đó một mình làm cho nó không thực tế để sử dụng trong bất kỳ tình huống thực tế nào. Tôi không chắc đó có phải là hành vi dự định hay không. – kizzx2

2

bản ghi DOES chạy trên chương trình Hello World. Heck Tôi sử dụng bản ghi để gỡ lỗi chính gdb!

+0

Cảm ơn bạn đã nhắc nhở! Tôi rõ ràng là không biết gì khi tôi cố gắng - nó nói "hoạt động không được hỗ trợ hoặc một cái gì đó." Tôi nghĩ rằng nó có thể liên quan đến các vấn đề 64bit 64bit. Tôi đã thử một lần nữa với Ubuntu 32 bit hoàn toàn và nó hoạt động như một sự quyến rũ! Bất kỳ hướng dẫn nào về lý do tại sao nó có thể không hoạt động trên Arch x86_64? (Tôi nghi ngờ nó có thể liên quan đến phiên bản 64 bit của glibc hoặc một cái gì đó, tôi không biết: P) – kizzx2

+0

ghi/phát lại đôi khi phun ra một số cảnh báo, nhưng điều đó không nhất thiết có nghĩa là nó không hoạt động. Nó cũng sẽ làm việc cho x86_64, nhưng hỗ trợ i386 là trưởng thành hơn. –

+0

Tôi đã xem xét vấn đề.Vấn đề cụ thể này là do libc của tôi được biên dịch để chứa một số lệnh MMX mà GDB 7.1 không hỗ trợ. Tôi đã kiểm tra HEAD (7.2 tại thời điểm viết bài) và nó đã hoạt động. – kizzx2

Các vấn đề liên quan