Dtruss не показывает вызовы mmap / sbrk?

Недавно я решил узнать больше о системном программировании и чувствовал, что было бы полезно узнать, каков мой код на самом деле делает под капотом.

Для этого я написал короткий класс LinkedList на C ++ и решил отследить его, используя dtruss (читай: dtrace).

Я ожидал, что любые инструкции, которые расширяют кучу (например, используя new ключевое слово, или создание экземпляров объектов LinkedList) будет вызывать mmap или же sbrk/break системные вызовы. Это был не тот случай!

На самом деле, работает dtruss с ключом -s я не вижу любой системные вызовы вызываются изнутри моего LinkedList::Add функция! Тестирование, я определенные элементы добавляются.

Может кто-нибудь объяснить, почему я не вижу ссылки на mmap/sbrk в моем выводе dtruss?

Бонусные баллы, если кто-то может объяснить цель mprotect а также madvise,

Я включил свой класс LinkedList, main.cpp и вывод dtruss ниже.

Спасибо!

выходной сигнал

SYSCALL(args)        = return
Created new LinkedList
Created new LinkedList
Destroyed a LinkedList
open("/dev/dtracehelper\0", 0x2, 0xFFFFFFFFE3236D70)         = 3 0
ioctl(0x3, 0x80086804, 0x7FFEE3236CD0)       = 0 0
close(0x3)       = 0 0
access("/AppleInternal/XBS/.isChrooted\0", 0x0, 0x0)         = -1 Err#2
thread_selfid(0x0, 0x0, 0x0)         = 198178 0
bsdthread_register(0x7FFF5BAB5C50, 0x7FFF5BAB5C40, 0x2000)       = 1073742047 0
issetugid(0x0, 0x0, 0x0)         = 0 0
mprotect(0x10C9D0000, 0x1000, 0x0)       = 0 0
mprotect(0x10C9D5000, 0x1000, 0x0)       = 0 0
mprotect(0x10C9D6000, 0x1000, 0x0)       = 0 0
mprotect(0x10C9DB000, 0x1000, 0x0)       = 0 0
mprotect(0x10C9CE000, 0x88, 0x1)         = 0 0
mprotect(0x10C9DC000, 0x1000, 0x1)       = 0 0
mprotect(0x10C9CE000, 0x88, 0x3)         = 0 0
mprotect(0x10C9CE000, 0x88, 0x1)         = 0 0
getpid(0x0, 0x0, 0x0)        = 1698 0
stat64("/AppleInternal/XBS/.isChrooted\0", 0x7FFEE32362E8, 0x0)      = -1 Err#2
stat64("/AppleInternal\0", 0x7FFEE3236380, 0x0)      = -1 Err#2
csops(0x6A2, 0x7, 0x7FFEE3235E20)        = -1 Err#22
sysctl([CTL_KERN, 14, 1, 1698, 0, 0] (4), 0x7FFEE3235F68, 0x7FFEE3235F60, 0x0, 0x0)      = 0 0
csops(0x6A2, 0x7, 0x7FFEE3235710)        = -1 Err#22
getrlimit(0x1008, 0x7FFEE32374F0, 0x0)       = 0 0
fstat64(0x1, 0x7FFEE3237508, 0x0)        = 0 0
ioctl(0x1, 0x4004667A, 0x7FFEE3237554)       = 0 0
write_nocancel(0x1, "Created new LinkedList\n\0", 0x17)      = 23 0
write_nocancel(0x1, "Created new LinkedList\n\0", 0x17)      = 23 0
write_nocancel(0x1, "Destroyed a LinkedList\n\0", 0x17)      = 23 0

LinkedList.cpp

#include <iostream>
#include "LinkedList.h"
using namespace std;

LinkedList::LinkedList() {
this->length = 0;
this->head = NULL;
this->tail = NULL;
cout << "Created new LinkedList" << endl;
}

LinkedList::~LinkedList() {
Node* curr;
Node* temp;
curr = this->head;

while ( curr ) {
temp = curr;
curr = curr->next;
delete temp;
}

cout << "Destroyed a LinkedList" << endl;
}

void LinkedList::Add(int v) {

Node* n = new Node();
n->val = v;
n->next = NULL;

if (!this->head) {
this->head = n;
this->tail = n;
} else {
this->tail->next = n;
this->tail = n;
}
}

main.cpp

#include <iostream>
#include "LinkedList.h"
using namespace std;

int main() {

LinkedList l; // You should require a heap increase, right?

LinkedList* ll = new LinkedList(); // Surely you require more heap!

for (int i=0; i<1000; i++)
l.Add(i);

return 0;

}

5

Решение

Я обнаружил, что Mac OS не использует sbrk/brk/break() для управления памятью, как и большинство UNIX / Linux. По сути, он использует ядро ​​Маха, которое Apple унаследовала от NeXT, поэтому вызовы памяти будут mpadvise(2) а также mprotect(2) которые предлагают более точный контроль зерна, чем sbrk(),

Из «Mac OS X и iOS Internals» Джонатана Левина:

введите описание изображения здесь

Таким образом, чтобы интерпретировать ваши распределения памяти, вам нужно знать mprotect(2) аргументы из sys/mman.h заголовок.

#define PROT_NONE       0x00    /* [MC2] no permissions */
#define PROT_READ       0x01    /* [MC2] pages can be read */
#define PROT_WRITE      0x02    /* [MC2] pages can be written */
#define PROT_EXEC       0x04    /* [MC2] pages can be executed */
....

И поэтому ваши системные вызовы подразумевают:

mprotect(0x10C9D0000, 0x1000, 0x0)       = 0 0
mprotect(0x10C9D5000, 0x1000, 0x0)       = 0 0
mprotect(0x10C9D6000, 0x1000, 0x0)       = 0 0
mprotect(0x10C9DB000, 0x1000, 0x0)       = 0 0
mprotect(0x10C9CE000, 0x88, 0x1)         = 0 0  <-- Allow reads starting at 0x10C9CE000 for 136 bytes
mprotect(0x10C9DC000, 0x1000, 0x1)       = 0 0
mprotect(0x10C9CE000, 0x88, 0x3)         = 0 0  <-- Allow reads and writes starting at 0x10C9CE000 for 136 bytes
mprotect(0x10C9CE000, 0x88, 0x1)         = 0 0

относительно mmap(2)в системах Linux он используется для отображения объектного кода общих библиотек, но не используется для malloc/free или же new/delete,

Рекомендации:

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]