Вывести значения типа структуры в GDB, используя адрес

Есть ли улов? Да, есть - левые соединения - это форма внешнего объединения, а внутренние соединения - это форма, ну, внутреннее соединение.

Вот примеры, которые показывают разницу. Мы начнем с базовых данных:

mysql> select * from j1;
+----+------------+
| id | thing      |
+----+------------+
|  1 | hi         |
|  2 | hello      |
|  3 | guten tag  |
|  4 | ciao       |
|  5 | buongiorno |
+----+------------+

mysql> select * from j2;
+----+-----------+
| id | thing     |
+----+-----------+
|  1 | bye       |
|  3 | tschau    |
|  4 | au revoir |
|  6 | so long   |
|  7 | tschuessi |
+----+-----------+

И здесь мы увидим разницу между внутренним соединением и левым соединением:

mysql> select * from j1 inner join j2 on j1.id = j2.id;
+----+-----------+----+-----------+
| id | thing     | id | thing     |
+----+-----------+----+-----------+
|  1 | hi        |  1 | bye       |
|  3 | guten tag |  3 | tschau    |
|  4 | ciao      |  4 | au revoir |
+----+-----------+----+-----------+

Хмм, 3 строки .

mysql> select * from j1 left join j2 on j1.id = j2.id;
+----+------------+------+-----------+
| id | thing      | id   | thing     |
+----+------------+------+-----------+
|  1 | hi         |    1 | bye       |
|  2 | hello      | NULL | NULL      |
|  3 | guten tag  |    3 | tschau    |
|  4 | ciao       |    4 | au revoir |
|  5 | buongiorno | NULL | NULL      |
+----+------------+------+-----------+

Ничего себе, 5 строк! Что произошло?

Внешние соединения, такие как left join, сохраняют строки, которые не совпадают, поэтому строки с идентификаторами 2 и 5 сохраняются левым запросом соединения. Остальные столбцы заполняются с помощью NULL.

Другими словами, левое и внутреннее соединения не являются взаимозаменяемыми.

2
задан Spinkoo 27 February 2019 в 16:37
поделиться

3 ответа

Для проверки памяти вне зависимости от типа данных программы gdb предоставляет команду x с синтаксисом follow,

x/nfu addr

Здесь /nfu является необязательным, где

n - сколько память для отображения в счетчике согласно опции u. Отрицательный знак спереди вызовет чтение с уменьшенным адресом

f - формат отображения

u - размер блока. Например, 'h' соответствуют полусловам

. Для данной структуры, чтение для двух целочисленных размеров в соответствии с вашей машиной даст содержание структуры. Первое целое число для значения n и второе для адреса указателя. Так что здесь для двух слов читать,

x/2uw 0x61b2e0
0
ответ дан Hari 27 February 2019 в 16:37
поделиться

Вы можете использовать команду x для печати с заданного адреса.

x (s_a*) 0x61b2e0
0
ответ дан alinsoar 27 February 2019 в 16:37
поделиться

(gdb) p *((s_a *)(<address>)) должен помочь вам распечатать содержимое структуры, на которую ссылается <address> виртуальный адрес, т. Е. В вашем случае это будет: (gdb) p *((s_a *)(0x61b2e0))

0
ответ дан Dmitry Gladkov 27 February 2019 в 16:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: