linux跟踪内存块,在Linux程序中跟踪活动使用的内存
我想跟蹤各種程序在特定狀態(tài)下觸摸的內(nèi)存量.例如,假設(shè)我有一個(gè)圖形程序.當(dāng)它被最小化時(shí),它可能會(huì)使用更少的內(nèi)存,因?yàn)樗粫?huì)重繪窗口,這需要讀取圖像和字體并執(zhí)行大量的庫(kù)函數(shù).這些對(duì)象仍可在內(nèi)存中訪問(wèn),但實(shí)際上并未使用它們.
像top這樣的工具用途有限,因?yàn)樗鼈冎皇歉嬖V我們將多少內(nèi)存映射到程序的地址空間,以及它有多少內(nèi)存駐留在物理RAM中.同樣,泄漏檢測(cè)器只會(huì)告訴內(nèi)存何時(shí)無(wú)法訪問(wèn),而不是僅僅是因?yàn)樗鼪](méi)有被使用.
是否存在可以以這種方式跟蹤活動(dòng)使用/未使用的內(nèi)存的現(xiàn)有工具?如果可能的話,我不僅要跟蹤堆上的使用情況,還要跟蹤存儲(chǔ)程序/庫(kù)代碼的內(nèi)存.
編輯:我想澄清一下:我想知道一個(gè)程序在某一點(diǎn)之后實(shí)際讀取,寫入或執(zhí)行的內(nèi)存,即一旦它達(dá)到某個(gè)狀態(tài).雖然地址空間中的頁(yè)數(shù)和常駐頁(yè)數(shù)是重要的測(cè)量值,但這不是我想要的.
我現(xiàn)在正在追求三種方法:
>我編寫了一個(gè)庫(kù),清除了使用`mprotect`從/ proc / self / maps讀取的所有內(nèi)存區(qū)域(堆棧及其自己的代碼除外)的保護(hù)位.它有一個(gè)segfault處理程序,可以恢復(fù)保護(hù)位并遞增計(jì)數(shù)器.我用`LD_PRELOAD`加載它,并在收到信號(hào)時(shí)開(kāi)始跟蹤內(nèi)存訪問(wèn).這產(chǎn)生了一些看似虛假地址的真正故障(它們?cè)诠收蠒r(shí)不存儲(chǔ)在任何寄存器或附近的存儲(chǔ)器中).
>我編寫了一個(gè)`purge`程序,它使用`mmap`從內(nèi)存中分配和讀取,直到`mmap`返回錯(cuò)誤.這有望強(qiáng)制執(zhí)行目標(biāo)進(jìn)程中的所有頁(yè)面,這些頁(yè)面在`purge`運(yùn)行時(shí)被暫停.然后,我使用`pidstat`計(jì)算目標(biāo)進(jìn)程恢復(fù)時(shí)頁(yè)面入口的數(shù)量.這似乎有效,但它是一個(gè)非常生硬的工具.它沒(méi)有提供有關(guān)觸摸的頁(yè)面的任何信息.
>我被告知valgrind允許您編寫插件,導(dǎo)致某些操作在某些事件上執(zhí)行,例如內(nèi)存訪問(wèn).到目前為止看起來(lái)很有希望
總結(jié)
以上是生活随笔為你收集整理的linux跟踪内存块,在Linux程序中跟踪活动使用的内存的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java 日期处理工具类_Java日期处
- 下一篇: c6011取消对null指针的引用_C/