Сейчас на форуме: cppasm, asfa (+6 невидимых)

 eXeL@B —› Вопросы новичков —› Управление памятью и ООП
Посл.ответ Сообщение

Ранг: 8.0 (гость), 7thx
Активность: 0.030
Статус: Участник

Создано: 13 апреля 2016 19:43
· Личное сообщение · #1

Доброго времени суток!
Собственно вопроса два:
1. Известно, что встроенные типы данных (для которых известен размер) хранятся в стеке, а объекты в куче. Каким образом можно просмотреть эти области памяти в уже откомпилированной программе так, чтобы определить, что это переменная типа int и сейчас она равна двум, а вот объект с полями, значения, которых равно. Я понимаю, что отладчиком, но как это сделать.
2. Утверждается, что C#, Java полностью объектные языки, а не "дорого" ли хранить int k = 7; в виде объекта?



Ранг: 590.4 (!), 408thx
Активность: 0.360.18
Статус: Модератор

Создано: 13 апреля 2016 19:49
· Личное сообщение · #2

Jb23
1. Что-то неправильно вам известно.
.data value_x dd 27
это стек или куча?
Данные хранятся так как определено разработчиком.
Хочешь в стеке:
void a() { int k = 3; }
Хочешь в куче:
void a() { int* k = new int; *k = 3; }
Хочешь в сегменте данных:
static int k = 3;
int a() { return k; }

2. Ты бы книжки почитал, что ли.

-----
старый пень


| Сообщение посчитали полезным: Jb23

Ранг: 8.0 (гость), 7thx
Активность: 0.030
Статус: Участник

Создано: 13 апреля 2016 20:15
· Личное сообщение · #3

2. Ты бы книжки почитал, что ли.
Такой вопрос возник, как раз после прочтения книг. Просто кто как пишет.

Данные хранятся так как определено разработчиком.
Спасибо!
Эту информацию можно как-то восстановить, то есть, например, узнать, что всего в программе 11 переменных, 6 из них в куче, 4 в стеке, 1 в сегменте данных.



Ранг: 53.9 (постоянный), 33thx
Активность: 0.050
Статус: Участник

Создано: 13 апреля 2016 21:19 · Поправил: deniskore
· Личное сообщение · #4

Jb23 пишет:
Эту информацию можно как-то восстановить, то есть, например, узнать, что всего в программе 11 переменных, 6 из них в куче, 4 в стеке, 1 в сегменте данных.

Можно, дизассемблируете жертву и смотрите:
1) Обращение к DS сегменту это static переменные. В asm коде это может выглядить так в IDA PRO
Code:
  1. mov     edx, ds:dword_40D140[eax*4]

2) Память для локальных переменных выделяется через asm команду sub sp, size , где sp stack pointer(esp,rsp в х86 и х64, R13 в ARM Thumb), size это размер в байтах.
3) Остальное можно отследить поставив брейкпоинты на функции --> выделения памяти <--.

| Сообщение посчитали полезным: Jb23

Ранг: 8.0 (гость), 7thx
Активность: 0.030
Статус: Участник

Создано: 13 апреля 2016 22:41
· Личное сообщение · #5

Спасибо большое!
Теперь осталось только понять всё ли в C# и Java представляет собой объект, например, встроенные типы это объекты или нет.



Ранг: 590.4 (!), 408thx
Активность: 0.360.18
Статус: Модератор

Создано: 14 апреля 2016 00:05
· Личное сообщение · #6

Jb23
Нет.

Добавлено спустя 3 минуты
Boxing and Unboxing (C# Programming Guide)

-----
старый пень



 eXeL@B —› Вопросы новичков —› Управление памятью и ООП
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати