Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
68 / 67 / 59
Регистрация: 14.07.2013
Сообщений: 251
1

GDB обращение к памяти

29.04.2015, 14:52. Просмотров 1085. Ответов 20
Метки нет (Все метки)


Прошу прощения за может глупый вопрос, но как такое может быть
(gdb) print _params.DirectReplies
$18 = true
(gdb) print (int)_params.DirectReplies
$19 = 1
(gdb) print &_params.DirectReplies
$20 = (bool *) 0x7fffffff98a1
(gdb) print *0x7fffffff98a1
$21 = -255
(gdb) print *(int *)0x7fffffff98a1
$22 = -255
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.04.2015, 14:52
Ответы с готовыми решениями:

Выделение памяти и обращение к ней
Здравствуйте! Вопрос таков: как обратиться к конкретным участкам памяти, если размер в байтах не...

Обращение к структуре в классе с выделением памяти
Добрый день уважаемые форумчане. Столкнулся с такой проблемой. Есть класс: class Components {...

Обращение к свойству класса в динамической памяти
Здравствуйте! Возникла проблема с обращением к свойству класса, расположенному в динамической...

Почему обращение к недоступному адресу в памяти
Почему при проверке кода(компиляции) выскакивает сообщение :"Недостаточный размер массивов или...

__________________
Помогаю в написании курсовых работ и дипломов здесь.
Записывайтесь на профессиональные курсы C++ разработчиков
20
14044 / 7525 / 1781
Регистрация: 30.01.2014
Сообщений: 12,584
29.04.2015, 15:14 2
akaAxeL, тебя удивляет, что bool в памяти представлен не как единица?
0
528 / 430 / 159
Регистрация: 25.11.2014
Сообщений: 1,662
29.04.2015, 15:32 3
Цитата Сообщение от akaAxeL Посмотреть сообщение
print (int)_params.DirectReplies
Не значит, что он возьмет из памяти sizeof(int) и конвертнет в int. Он возьмет bool и уже его значение расширит до int. Поэтому
Цитата Сообщение от akaAxeL Посмотреть сообщение
print *0x7fffffff98a1
и
Цитата Сообщение от akaAxeL Посмотреть сообщение
print *(int *)0x7fffffff98a1
можно не удивляться.
0
Evg
Эксперт CАвтор FAQ
21153 / 8169 / 628
Регистрация: 30.03.2009
Сообщений: 22,469
Записей в блоге: 30
29.04.2015, 15:41 4
Ради интереса покажи ещё выдачу "print (int)true" и "print (_params.DirectReplies == true)"

Добавлено через 4 минуты
Цитата Сообщение от DrOffset Посмотреть сообщение
akaAxeL, тебя удивляет, что bool в памяти представлен не как единица?
Возьмём пример:

C++
int G;
 
void foo (bool t)
{
  if (t == true)
    G = 5;
  else
    G = 7;
}
посмотрим на сгенерированный код:

Код
$ g++ t.c -S -O1
$ cat t.s
...
        movl    4(%esp), %eax
        cmpb    $1, %al
        sbbl    %eax, %eax
        andl    $2, %eax
        addl    $5, %eax
        movl    %eax, G
        ret
...
компилятор построил код, из которого вытекает, что true в памяти может лежать только как "1", в противном случае проверка бы работала неправильно
0
528 / 430 / 159
Регистрация: 25.11.2014
Сообщений: 1,662
29.04.2015, 15:54 5
Эту фигню самому можно сделать таким образом (где a - bool):
Код
(gdb) set var *(int*)&a=-255
(gdb) x/16bx 0x7fffffffe5ef
0x7fffffffe5ef:	0x01	0xff	0xff	0xff	0x00	0x00	0x00	0x00
0x7fffffffe5f7:	0x00	0x1d	0xed	0xc1	0x47	0x3d	0x00	0x00
(gdb) p *0x7fffffffe5ef
$11 = -255
(gdb) p *(bool*)0x7fffffffe5ef
$13 = true
(gdb) p (int)a
$14 = 1
Понять бы вопрос автора: как может быть что конкретно?
0
Evg
Эксперт CАвтор FAQ
21153 / 8169 / 628
Регистрация: 30.03.2009
Сообщений: 22,469
Записей в блоге: 30
29.04.2015, 16:04 6
Тогда скорее всего отладчик при печати типа bool все ненулевые значения печатает как "true"

Добавлено через 6 минут
Хотя та версия отладчика (gdb-7.7.1), которая у меня стоит, печатает 255, а не true
0
14044 / 7525 / 1781
Регистрация: 30.01.2014
Сообщений: 12,584
29.04.2015, 16:08 7
Evg, вообще говоря твой конкретный пример не говорит ни о чем. Автор скорее всего банально переменную забыл инициализировать.
3.9.1
Using a bool value in ways described by this International Standard as “undefined,” such as by examining the value of an
uninitialized automatic object, might cause it to behave as if it is neither true nor false.
0
68 / 67 / 59
Регистрация: 14.07.2013
Сообщений: 251
29.04.2015, 16:10  [ТС] 8
Да насчет того что я bool к int привел, это я уже понял что так не надо делать. Но основная проблема в том, если я ставлю watchpoint он мне пишет old value -255 new value 0, хотя _params.DirectReplies объявляется один раз при объявлении структуры _params, и задается он как true, вот я не могу понять что его вообще меняет
0
14044 / 7525 / 1781
Регистрация: 30.01.2014
Сообщений: 12,584
29.04.2015, 16:14 9
Цитата Сообщение от akaAxeL Посмотреть сообщение
хотя _params.DirectReplies объявляется один раз при объявлении структуры _params, и задается он как true, вот я не могу понять что его вообще меняет
Расстрел памяти?
Ошибка, вероятнее всего, в другом месте, а тут просто "бахнуло".
0
Evg
Эксперт CАвтор FAQ
21153 / 8169 / 628
Регистрация: 30.03.2009
Сообщений: 22,469
Записей в блоге: 30
29.04.2015, 16:16 10
Цитата Сообщение от DrOffset Посмотреть сообщение
Evg, вообще говоря твой конкретный пример не говорит ни о чем
Он говорит о том, что bool в памяти представлен как единица. Ибо сравнение "== true" построено через "== 1", а вовсе не "!= 0"

Добавлено через 1 минуту
Цитата Сообщение от DrOffset Посмотреть сообщение
Расстрел памяти?
Ошибка, вероятнее всего, в другом месте, а тут просто "бахнуло"
watchpoint бы среагировал. Он аппаратно за изменением памяти следит
0
14044 / 7525 / 1781
Регистрация: 30.01.2014
Сообщений: 12,584
29.04.2015, 16:20 11
Цитата Сообщение от Evg Посмотреть сообщение
Он говорит о том, что bool в памяти представлен как единица. Ибо сравнение "== true" построено через "== 1", а вовсе не "!= 0"
Вообще-то, мой первый пост в этой теме был совсем не об этом.
0
Evg
Эксперт CАвтор FAQ
21153 / 8169 / 628
Регистрация: 30.03.2009
Сообщений: 22,469
Записей в блоге: 30
29.04.2015, 16:21 12
Цитата Сообщение от DrOffset Посмотреть сообщение
Вообще-то, мой первый пост в этой теме был совсем не об этом
А о чём?
0
14044 / 7525 / 1781
Регистрация: 30.01.2014
Сообщений: 12,584
29.04.2015, 16:32 13
Цитата Сообщение от Evg Посмотреть сообщение
А о чём?
А том, что я процитировал в посте 7.

Добавлено через 7 минут
Evg, Я имел в виду, что твой пример не говорит о причинах такого поведения, а ставит перед фактом. Между тем неявно перепутана причина и следствие. Понятно, что если делать все правильно, то значение будет как в твоем примере. Но это не означает автоматически, что бинарное представление гарантированно будет таким всегда. Пример в 7 посте. Именно на это я намекал в первом сообщении.
Но у автора тут что-то другое, судя по всему.
0
Evg
Эксперт CАвтор FAQ
21153 / 8169 / 628
Регистрация: 30.03.2009
Сообщений: 22,469
Записей в блоге: 30
29.04.2015, 16:46 14
Цитата Сообщение от DrOffset Посмотреть сообщение
Но это не означает автоматически, что бинарное представление гарантированно будет таким всегда
Мы с разных позиций смотрим на вопрос. Я со стороны того, как строит код компилятор, а ты со стороны того, что там может оказаться в runtime. Потому и не поняли друг друга
0
DrOffset
29.04.2015, 16:50
  #15

Не по теме:

Цитата Сообщение от Evg Посмотреть сообщение
Потому и не поняли друг друга
Ну да, согласен.

0
68 / 67 / 59
Регистрация: 14.07.2013
Сообщений: 251
29.04.2015, 17:04  [ТС] 16
Вот кстати backtrace watchpointa Hardware watchpoint 3: *0x7fffffff9d44

Old value = -255
New value = 0
0x0000003725a845b2 in __memset_sse2 () from /lib64/libc.so.6
(gdb) backtrace
#0 0x0000003725a845b2 in __memset_sse2 () from /lib64/libc.so.6
А в начале самом Old value = 1, и потом она меняется на -255 не понятно почему, ну вернее по этой причине 0x0000003725a845b2 in __memset_sse2 () from /lib64/libc.so.6. Подскажите куда копать вообще
0
Evg
Эксперт CАвтор FAQ
21153 / 8169 / 628
Регистрация: 30.03.2009
Сообщений: 22,469
Записей в блоге: 30
29.04.2015, 17:08 17
Цитата Сообщение от akaAxeL Посмотреть сообщение
А в начале самом Old value = 1, и потом она меняется на -255
Вот это и есть причина того, что в переменной корявое значение. А остальные, не видя исходников, могут только гадать
0
68 / 67 / 59
Регистрация: 14.07.2013
Сообщений: 251
29.04.2015, 17:10  [ТС] 18
Так она на -255 сама меняется не моими силами)
0
14044 / 7525 / 1781
Регистрация: 30.01.2014
Сообщений: 12,584
29.04.2015, 17:17 19
Цитата Сообщение от akaAxeL Посмотреть сообщение
Так она на -255 сама меняется не моими силами)
Это и есть расстрел памяти.
Где-то в другом месте программы есть код (некорректный), который пишет в чужую память. Например тот же memset, у которого был некорректный параметр размера записываемого участка. И вот он записал "случайно" в память, где располагается твоя структура, расстреляв ее тем самым новым значением.
1
68 / 67 / 59
Регистрация: 14.07.2013
Сообщений: 251
29.04.2015, 17:20  [ТС] 20
Ясно, спасибо большое.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.04.2015, 17:20

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь или здесь.

Обращение к памяти
есть процедурка замены определения символа с номером num из банка bank на символ, образ которого...

Прямое обращение к памяти
Доброго всем времени суток. Товарищи, помогите пожалуйста найти литературу для компилятора DJGPP....

GDB: можно ли отследить изменение памяти?
В GDB есть возможность поставить briokpoint либо на конкретную команду, либо на изменение выражения...

CodeLite ошибка failed to locate gdb! at 'gdb'
Установил на двух компьютерах CodeLite. На десятке и на семерке. Выдает окошко failed to locate...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.