2013-04-19 21 views
7

Tôi có phần mềm bị lỗi (bộ nhớ bị rò rỉ). Là một bằng chứng, tôi có 1GB tệp core.dump. Kích thước heap là 900MB, do đó, rõ ràng, một cái gì đó phân bổ, nhưng không giải phóng bộ nhớ.gdb, kết xuất bộ nhớ, lưu đầu ra được định dạng thành tệp

Vì vậy, tôi có một vùng bộ nhớ để kiểm tra như thế này.

(gdb) x/50000s 0x200000000 

Tuy nhiên, khó đoán chỉ với mắt thường, đối tượng hoặc cấu trúc nào không được giải phóng. Ý tưởng của tôi là theo dõi, "Lưu đầu ra được định dạng gdb thành tệp và chạy mẫu khớp để xem chuỗi ma thuật nào xuất hiện nhiều nhất". Vì vậy, đây là câu hỏi của tôi:

Làm thế nào tôi có thể lưu đầu ra của lệnh sau vào một tệp văn bản, để tôi có thể viết một trình phân tích?

(gdb) x/10000000s 0x20000000 <-- I need this output into a file 

Cảm ơn bạn đã được trợ giúp.

Trả lời

7

Làm cách nào để lưu đầu ra của lệnh sau vào một tệp văn bản, để tôi có thể viết một trình phân tích?

(gdb) x/10000000s 0x20000000 

Đó là thực sự khá dễ dàng:

(gdb) set height 0 # prevent GDB from stopping every screenfull 
(gdb) set logging on # GDB output is now also copied into gdb.txt 
(gdb) x/10000000s 0x20000000 
(gdb) quit 

Voila, thưởng thức đầu ra của bạn trong gdb.txt.

Tôi có phần mềm bị lỗi (bộ nhớ bị rò rỉ). ... "Lưu đầu ra được định dạng gdb thành tệp và chạy mẫu khớp để xem chuỗi ma thuật nào xuất hiện nhiều nhất".

Ý tưởng đó không thể mang lại kết quả khả quan. Hãy xem xét:

void some_function() { 
    std::vector<string> *v = new std::vector<string>(); 
    // code to insert and use 1000s of strings into "v". 
    return; // Oops: forgot to delete "v". 
} 

Thậm chí nếu bạn có thể thấy chuỗi ma thuật có hiệu quả nhất, bạn sẽ phát hiện ra rằng bạn đang làm rò rỉ tất cả các chuỗi; nhưng chúng là không phải là vấn đề, rò rỉ "v" là vấn đề.

Vì vậy, điều bạn thực sự muốn là xây dựng biểu đồ phân bổ vùng nào trỏ đến các vùng được phân bổ khác và tìm "gốc" của biểu đồ đó. Điều này gần như không thể làm bằng tay.

Vì vậy, nhiều hơn có khả năng giúp bạn tìm (các) rò rỉ bộ nhớ là gì? May mắn thay, có rất nhiều công cụ có thể giải quyết vấn đề này cho bạn:

+0

Ngoài ra còn có một lệnh bãi chuyên dụng trong gdb. Xem thêm: https://sourceware.org/gdb/onlinedocs/gdb/Dump_002fRestore-Files.html – Alex

16

Bạn có thể sử dụng "đổ" chức năng của gdb, xem: https://sourceware.org/gdb/onlinedocs/gdb/Dump_002fRestore-Files.html

Ví dụ của bạn:

dump binary memory result.bin 0x200000000 0x20000c350 

này sẽ cung cấp cho bạn một đồng bằng bãi nhị phân int tập tin result.bin. Bạn cũng có thể sử dụng sau đây để đổ nó trong định dạng hex:

dump ihex memory result.bin 0x200000000 0x20000c350 

Sử dụng lệnh bãi là rõ ràng hơn nhiều so với sử dụng hack gdb khai thác gỗ (mà thậm chí không làm việc cho tôi bằng cách nào đó).

0

bạn có thể viết LKM đơn giản sẽ làm điều đó

lkm: 
#include <linux/kernel.h> 
#include <linux/module.h> 

int *ptr=(int*)0Xc18251c0; //the address you want to read from kernel space 
int module_i(void) 
{ 
printk("%d\n",*ptr); 
} 
module_init(module_i); 

và các dữ liệu sẽ hiển thị trong log để viết

enter code here 
dmesg 
+0

Bạn chỉ có thể sử dụng/dev/kmem hoặc/proc/kcore để làm điều đó. Furthurmore, điều này không trả lời câu hỏi. – minmaxavg

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