gdb

Ivan8209

Чего-то я либо торможу, либо глючу.
Ткните меня в man или info по gdb, как тормознуть прогу.
Симптомы.
Хочу изврата, и пишу
.section __text, "rwa" ...
.globl _start
_start: ...
movl $1, %eax
int $0x80
.end
> as -o a.o a.s
...
> ld a.o
...
> gdb a.out
...
(gdb) break _start
...
(gdb) run
Starting .../a.out
Hello, world!
Program terminated successfully.
(gdb) _
А как же breakpoint?
Та же ерунда с hbreak.
gdb 5.3
kernel 2.4.20 штатной сборки Slackware 9.0 vmlinux-ide-....
Что я делаю не так?
---
...Я работаю...

Zhich

не могу сказать, что я крут в gdb,
но
(gdb) b <filename>: строка
у меня всегда ставила breakpoint туда, куда требовалось.
вообще (gdb) break _start возвращает сообщение о корректной постановки breakpoint или ругается?

Ivan8209

> не могу сказать, что я крут в gdb,
> но
> (gdb) b <filename>: строка
> у меня всегда ставила breakpoint туда, куда требовалось.
А если строки нет?
> вообще (gdb) break _start возвращает сообщение
> о корректной постановки breakpoint или ругается?
А он вообще ничего не вовзращает.
Вот так:
(gdb) br _start
(gdb) _
Чего-то Линукс совсем не хакерская платформа.
Хакерская платформа --- это ZX "Spectrum".
Интересно, а другие отладчики есть?
А то я уже стал по-спектрумовски писать встроенный монитор.
---
ZX "Spectrum" forever!

ser1963

Короче, у тебя странное название (хотя так надо, да?) и _очень_ странные аттрибуты (так точно не надо) секции.

Ivan8209

Я не могу переопределить ``.text'',
а мне надо будет досоздавать исполняемый код на лету.
Если я не смогу писать в секцию кода,
то куда я буду дописывать и как исполнять дописанный код?
Отсюда, секция кода с возможностью записи (иначе --- ``Segmentation fault.''
имеющая нештатное имя, поскольку иначе --- ``Attributes ignored.''
---
...Я работаю...

Ivan8209

Кстати, это _работает_.
Но, почему-то, не воспринимается штатным отладчиком.
Если кто знает другой отладчик, обязательно с исходниками,
то я попробую и его.
---
...Я работаю...

ser1963

А где ".x."?

Ivan8209

Наизусть атрибутов секции не помню, а в описание отладчика лезть лень.
Важно следующее:
1) ``.text'' не получается сделать доступным на запись --- ``ignored'';
2) ни ``break'', ни ``hbreak'' не срабатывают.
Вопрос: как отлаживать?
---
...Я работаю...

ser1963

1) хз где ты взял атрибут "r". Там такого нету.
2) Если ты уберёшь свой изврат с секциями, то убедишься, что break на _start (program entry point by default) не работает тоже.
3) Это исполняемая секция => нужен атрибут "x".

Ivan8209

> 1) хз где ты взял атрибут "r". Там такого нету.
Писал по памяти, мог и ошибиться.
> 2) Если ты уберёшь свой изврат с секциями, то убедишься,
> что break на _start (program entry point by default) не работает тоже.
Так, я про то и говорю, что ни break, ни hbreak на _start не работают.
У меня прога уже тестовая, выводит "Hello, world!\n" через kernel API.
> 3) Это исполняемая секция => нужен атрибут "x".
Прога работает => он там есть.
Значит, я его забыл при написании сюда.
Вопрос остался открыт.
Как отлаживать, если даже точки прерывания не срабатывают?
---
"Vyroba umelych lidi, slecno, je tovarni tajemstvi."
Karel Capek

ser1963

Ну так если ты всё это знаешь, то кто мешает тебе вставить nop с меткой ggg после _start, а потом делать break ggg?

Ivan8209

Хм.
Надо попробовать.
А в чём засада-то?
Почему надо так:
/^\/^\/^\/^\/^\/^\
_start: nop
_bpt: ...
/^\/^\/^\/^\/^\/^\
(gbd) br _bpt
/^\/^\/^\/^\/^\/^\
а не так:
/^\/^\/^\/^\/^\/^\
_start: nop
...
/^\/^\/^\/^\/^\/^\
(gbd) br _start
/^\/^\/^\/^\/^\/^\
А можно делать вот так (см. ниже)?
/^\/^\/^\/^\/^\/^\
_start:
_bpt: ...
/^\/^\/^\/^\/^\/^\
(gbd) br _bpt
/^\/^\/^\/^\/^\/^\
Я не понимаю, чем руководствовались писатели gdb...
---
"Vyroba umelych lidi, slecno, je tovarni tajemstvi."
Karel Capek

evgeha

Они руководствовались соображением, что с помощью gdb будут отлаживать С-шные программы. Поэтому если ставится break на функцию,
то пропускается пролог, чтобы прога встала на начале самой функции.
Вообще если очень интересно, что происходит, давай работающий(или не работающий) пример.

alex-kras

>14.71

Ivan8209

Шаман?
1.s:


.section text,"awx", @progbits
.global _start
_start: movl $len,%edx
movl $msg,%ecx
movl $1,%ebx # stdout
movl $4,%eax # write
int $0x80 # kernel call
movl $0,%ebx # exit code
movl $1,%eax # exit
int $0x80
msg: .string "Hello, world!\n"
len = .-msg
.end


% as -o 1.o 1.s
% ld 1.o
% gdb a.out | tee a.log
a.log:


GNU gdb 5.3
Copyright 2002 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i386-slackware-linux"...
(no debugging symbols found)...
(gdb) br _start
Breakpoint 1 at 0x8049074
(gdb) r
Starting program: /home/.../a.out
Hello, world!
Program exited normally.
(gdb) disass _start
Dump of assembler code for function _start:
0x8049074 <_start>: mov $0xf,%edx
0x8049079 <_start+5>: mov $0x8049096,%ecx
0x804907e <_start+10>: mov $0x1,%ebx
0x8049083 <_start+15>: mov $0x4,%eax
0x8049088 <_start+20>: int $0x80
0x804908a <_start+22>: mov $0x0,%ebx
0x804908f <_start+27>: mov $0x1,%eax
0x8049094 <_start+32>: int $0x80
End of assembler dump.
(gdb) q


1a.s:


.section text,"awx", @progbits
.global _start
_start: nop
_br: movl $len,%edx
movl $msg,%ecx
movl $1,%ebx # stdout
movl $4,%eax # write
int $0x80 # kernel call
movl $0,%ebx # exit code
movl $1,%eax # exit
int $0x80
msg: .string "Hello, world!\n"
len = .-msg
.end


% as -o 1a.o 1a.s
% ld 1a.o
% gdb a.out | tee aa.log
aa.log:


GNU gdb 5.3
Copyright 2002 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i386-slackware-linux"...
(no debugging symbols found)...
(gdb) br _br
Breakpoint 1 at 0x8049075
(gdb) r
Starting program: /home/.../a.out
Breakpoint 1, 0x08049075 in _br
(gdb) disass _start
Dump of assembler code for function _start:
0x8049074 <_start>: nop
End of assembler dump.
(gdb) disass _br
Dump of assembler code for function _br:
0x8049075 <_br>: mov $0xf,%edx
0x804907a <_br+5>: mov $0x8049097,%ecx
0x804907f <_br+10>: mov $0x1,%ebx
0x8049084 <_br+15>: mov $0x4,%eax
0x8049089 <_br+20>: int $0x80
0x804908b <_br+22>: mov $0x0,%ebx
0x8049090 <_br+27>: mov $0x1,%eax
0x8049095 <_br+32>: int $0x80
End of assembler dump.
(gdb) q
The program is running. Exit anyway? (y or n)


Но я так и не понял, почему нельзя:
(gdb) br _start
---
"Vyroba umelych lidi, slecno, je tovarni tajemstvi."
Karel Capek

duantusova

Ну проблема в том, что gdb сам при старте ставит вспомогательные breakpoint на _start.
Поэтому он ничего не пишет. Если попытаться поставить break, когда программа отработала,
тогда напишет.
Увидеть это можно по команде после того, как программа уже отработала.
(gdb)maintaince info breakpoint
Ну зачем это делается понятно, gdb хочет перехватить загружаемые библиотеки и т.д.
Код этого всего можно посмотреть в файле
solib-svr4.c
особенно функцию enable_break.
Про то, как это выключить, там написано следующее:
FIXME

Between enable_break and disable_break this code does not
properly handle hitting breakpoints which the user might have
set in the startup code or in the dynamic linker itself. Proper
handling will probably have to wait until the implementation is
changed to use the "breakpoint handler function" method.

Вывод - можно ставить break куда угодно, кроме _start, и __start если нет _start. На main, если нет
_start и __start.

Ivan8209

М-да. Зарезаться тапком.
Хоть бы FAQ вели, что ли?
Кстати, а в 6.0 это не поправили?
---
"Vyroba umelych lidi, slecno, je tovarni tajemstvi."
Karel Capek
Оставить комментарий
Имя или ник:
Комментарий: