c++ - كيف ترى تخطيط الذاكرة من برنامجي في C خلال وقت التشغيل؟



linux memory-management (2)

بديل آخر هو أداة بماب الذي يقضي على تفاصيل عملية رسم الخرائط الذاكرة:

    pmap [ -x | -d ] [ -q ] pids...
    pmap -V

بماب هو جزء من مجموعة بروبس.

أيضا إذا كنت مهتما في رسم الخرائط المادية، يمكنك إلقاء نظرة على باجيماب، وهو متاح في نواة لينكس الأخيرة للسماح عملية تعرف انها معلومات الذاكرة الفعلية. قد يكون من المفيد لتطوير محرك مساحة المستخدم حيث تحتاج عملية مساحة المستخدم للعثور على عنوان الفعلي من المخزن المؤقت كوجهة دما.

https://www.kernel.org/doc/Documentation/vm/pagemap.txt

https://src-bin.com

أود أن أرى تخطيط الذاكرة من برنامجي في C بحيث أستطيع أن أفهم كل شرائح مختلفة من الذاكرة عمليا خلال وقت التشغيل مثل التغيير في بس أو كومة ل إكس؟


Answer #1

إذا كنت على لينكس استخدام غكور للحصول على تفريغ الأساسية ثابت، انها جزء من غب ...

gcore $pid > Corefile

أو

gcore -o core_dump $pid

لتصحيح البرنامج قيد التشغيل نعلق عليه باستخدام غب

gdb -p 1234

ثم كزة حولها في ذلك. لنرى كيف انها لايد

(gdb) maint info sections
Exec file:
    `/home/foo/program', file type elf32-i386.
 [0]     0x8048134->0x8048147 at 0x00000134: .interp ALLOC LOAD READONLY DATA HAS_CONTENTS
 [1]     0x8048148->0x8048168 at 0x00000148: .note.ABI-tag ALLOC LOAD READONLY DATA HAS_CONTENTS
 [2]     0x8048168->0x804818c at 0x00000168: .note.gnu.build-id ALLOC LOAD  
.....
.....
[23]     0x8049a40->0x8049ad1 at 0x00000a40: .data ALLOC LOAD DATA HAS_CONTENTS
[24]     0x8049ad1->0x8049ad4 at 0x00000ad1: .bss ALLOC

لكزة حول في استخدام السجلات

(gdb) info all-registers
eax            0xfffffdfc   -516
ecx            0x0  0
edx            0x1  1
ebx            0xffeedc28   -1123288
esp            0xffeedc0c   0xffeedc0c
ebp            0xffeedc78   0xffeedc78
esi            0x1308   4872
edi            0x45cf   17871
.... snipped

إذا كنت تريد أن ترى التجمع المستخدمة لوظيفة معينة استخدام disassemble . ويمكن أيضا أن تستخدم مع عناوين في الذاكرة.

(gdb) disassemble main
Dump of assembler code for function main:
   0x080483f0 <+0>: lea    0x4(%esp),%ecx
   0x080483f4 <+4>: and    $0xfffffff0,%esp
   0x080483f7 <+7>: mov    $0x8048780,%edx
   0x080483fc <+12>:    pushl  -0x4(%ecx)
   0x080483ff <+15>:    push   %ebp
   0x08048400 <+16>:    mov    %esp,%ebp
   ....
   ....




gdb