gdb
но
(gdb) b <filename>: строка
у меня всегда ставила breakpoint туда, куда требовалось.
вообще (gdb) break _start возвращает сообщение о корректной постановки breakpoint или ругается?
> но
> (gdb) b <filename>: строка
> у меня всегда ставила breakpoint туда, куда требовалось.
А если строки нет?
> вообще (gdb) break _start возвращает сообщение
> о корректной постановки breakpoint или ругается?
А он вообще ничего не вовзращает.
Вот так:
(gdb) br _start
(gdb) _
Чего-то Линукс совсем не хакерская платформа.
Хакерская платформа --- это ZX "Spectrum".
Интересно, а другие отладчики есть?
А то я уже стал по-спектрумовски писать встроенный монитор.
---
ZX "Spectrum" forever!
Короче, у тебя странное название (хотя так надо, да?) и _очень_ странные аттрибуты (так точно не надо) секции.
а мне надо будет досоздавать исполняемый код на лету.
Если я не смогу писать в секцию кода,
то куда я буду дописывать и как исполнять дописанный код?
Отсюда, секция кода с возможностью записи (иначе --- ``Segmentation fault.''
имеющая нештатное имя, поскольку иначе --- ``Attributes ignored.''
---
...Я работаю...
Но, почему-то, не воспринимается штатным отладчиком.
Если кто знает другой отладчик, обязательно с исходниками,
то я попробую и его.
---
...Я работаю...
А где ".x."?
Важно следующее:
1) ``.text'' не получается сделать доступным на запись --- ``ignored'';
2) ни ``break'', ни ``hbreak'' не срабатывают.
Вопрос: как отлаживать?
---
...Я работаю...
2) Если ты уберёшь свой изврат с секциями, то убедишься, что break на _start (program entry point by default) не работает тоже.
3) Это исполняемая секция => нужен атрибут "x".
Писал по памяти, мог и ошибиться.
> 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
Ну так если ты всё это знаешь, то кто мешает тебе вставить nop с меткой ggg после _start, а потом делать break ggg?
Надо попробовать.
А в чём засада-то?
Почему надо так:
/^\/^\/^\/^\/^\/^\
_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
то пропускается пролог, чтобы прога встала на начале самой функции.
Вообще если очень интересно, что происходит, давай работающий(или не работающий) пример.
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
Поэтому он ничего не пишет. Если попытаться поставить 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.
Хоть бы FAQ вели, что ли?
Кстати, а в 6.0 это не поправили?
---
"Vyroba umelych lidi, slecno, je tovarni tajemstvi."
Karel Capek
Оставить комментарий
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-....
Что я делаю не так?
---
...Я работаю...