GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana cara mendeteksi jumlah byte yang dialokasikan oleh proses di Heap secara terprogram?

Saya pikir mallinfo() adalah yang Anda inginkan:

#include <malloc.h>


struct mallinfo *info;

info = mallinfo();

printf ("total allocated space:  %llu bytes\n", info->uordblks);
printf ("total free space:       %llu bytes\n", info->fordblks);

Struktur struct mallinfo bersifat teknis, dan khusus untuk implementasi malloc(). Tetapi informasi yang Anda inginkan ada di sana. Inilah cara saya melaporkan nilai:

mallinfo.arena = "Total Size (bytes)" 
mallinfo.uordblks = "Busy size (bytes)" 
mallinfo.fordblks = "Free size (bytes)" 
mallinfo.ordblks = "Free blocks (count)" 
mallinfo.keepcost = "Top block size (bytes)" 
mallinfo.hblks = "Blocks mapped via mmap() (count)" 
mallinfo.hblkhd = "Bytes mapped via mmap() (bytes)"

Keduanya diduga tidak digunakan, tetapi tampaknya berubah di sistem saya, dan karenanya mungkin valid:

mallinfo.smblks = "Fast bin blocks (count)"
mallinfo.fsmblks = "Fast bin bytes (bytes)"

Dan nilai menarik lainnya dikembalikan oleh "sbrk (0)"


Ada sejumlah kemungkinan.

Seberapa akurat Anda membutuhkannya? Anda bisa mendapatkan beberapa data berguna melalui cat /proc/${PID}/status | grep VmData .

Anda dapat #define malloc() Anda sendiri , realloc() , kalloc() , dan gratis() fungsi, membungkus fungsi sebenarnya di belakang meja Anda sendiri. Anda dapat melakukan hal-hal keren di sini dengan __FILE__, __LINE__, &__func__ untuk memudahkan mengidentifikasi kebocoran inti dalam pengujian sederhana. Tapi itu hanya akan melengkapi kode Anda sendiri!

(Demikian pula, Anda juga dapat mendefinisikan ulang operator baru default dan hapus operator metode, varian array dan non-array, dan keduanya melempar varian std::bad_alloc dan std::nothrow_t. Sekali lagi, ini hanya akan melengkapi kode Anda sendiri!)

(Perhatikan:Pada sebagian besar sistem C++, baru akhirnya memanggil malloc() . Tidak harus. Terutama dengan baru di tempat ! Namun biasanya baru menggunakan malloc() . (Atau beroperasi pada wilayah memori yang sebelumnya telah malloc()'ed .) Kalau tidak, Anda akan masuk ke hal-hal yang sangat funky dengan beberapa manajer heap...)

Anda dapat menggunakan sbrk(0) untuk melihat di mana segmen data saat ini disetel. Itu tidak terlalu bagus. Ini adalah pengukuran yang sangat kasar, dan tidak memperhitungkan lubang (wilayah memori yang tidak terpakai) di heap. (Anda jauh lebih baik dengan VmData baris dari /proc/${PID}/status .) Namun jika Anda hanya mencari gambaran umum...

Anda dapat menjebak malloc()/free()/etc dengan menulis perpustakaan bersama Anda sendiri dan memaksa proses Anda untuk menggunakannya alih-alih versi sebenarnya melalui LD_PRELOAD . Anda dapat menggunakan dlopen()/dlsym() untuk memuat &memanggil *real* malloc()/free()/etc . Ini bekerja dengan sangat indah. Kode asli tidak dimodifikasi, bahkan tidak dikompilasi ulang. Namun waspadai situasi peserta ulang saat mengkode perpustakaan ini, dan bahwa proses Anda awalnya akan memanggil malloc()/calloc()/realloc() sebelum dlopen()/dlsym() dapat menyelesaikan pemuatan fungsi sebenarnya.

Anda dapat melihat alat seperti Valgrind , meskipun itu sebenarnya lebih ditujukan pada kebocoran memori.

Lagi pula, mungkin mtrace() adalah apa yang Anda inginkan? Atau __malloc_hook ? Sangat berpemilik (GNU) &tidak standar... Tapi Anda diberi tag "Linux"...


Tidak ada yang mudah, otomatis cara untuk melakukannya, jika itu yang Anda minta. Anda pada dasarnya harus melacak sendiri alokasi tumpukan secara manual menggunakan variabel penghitung. Masalahnya adalah sulit untuk mengontrol bagian mana dari program Anda yang mengalokasikan memori di heap, terutama jika Anda menggunakan banyak pustaka di luar kendali Anda. Untuk lebih memperumit masalah, ada dua cara program mengalokasikan memori heap:new atau malloc . (Belum lagi panggilan OS langsung seperti sbrk .)

Anda dapat mengganti operator global new , dan minta setiap panggilan untuk meningkatkan penghitungan global. Namun, ini belum tentu termasuk saat program Anda memanggil malloc , atau saat program Anda menggunakan beberapa new khusus kelas mengesampingkan. Anda juga dapat mengganti malloc menggunakan makro, tetapi ini belum tentu portabel. Dan Anda juga harus mengganti semua variasi malloc , seperti realloc , calloc , dll. Semua ini semakin diperumit oleh fakta bahwa pada beberapa implementasi, new sendiri dapat memanggil malloc .

Jadi, pada dasarnya, sangat sulit untuk melakukannya dengan benar dari dalam program Anda. Sebaiknya gunakan alat pemrofil memori saja.


Linux
  1. Bagaimana Cara Mendeteksi Bash>=4.0?

  2. Bagaimana cara menghitung baris dalam dokumen?

  3. Secara khusus, bagaimana fork() menangani memori yang dialokasikan secara dinamis dari malloc() di Linux?

  1. Cara memeriksa ukuran heap untuk suatu proses di Linux

  2. Bagaimana menerapkan malloc deterministik

  3. Cara membunuh proses zombie

  1. Cara mematikan proses zombie di Linux

  2. Bagaimana Mengidentifikasi Port ke Suatu Proses?

  3. Bagaimana cara menghitung jumlah byte dalam sebuah file, mengelompokkan byte yang sama?