The OpenNET Project / Index page

[ новости/++ | форум | wiki | теги ]

Внедрение точек останова gdb в исходный код
На github опубликован способ внедрения в исходный код точек останова для
gdb, не влияющий на нормальное выполнение программы в отсутствие отладчика.
Способ основан на размещении адреса локальной переменной в секции
(embed-breakpoints линкера).


  #define EMBED_BREAKPOINT \\
    asm("0:"                              \\
        ".pushsection embed-breakpoints;" \\
        ".quad 0b;"                       \\
        ".popsection;")

   int main() {
       printf("Hello,\\n");
       EMBED_BREAKPOINT;
       printf("world!\\n");
       EMBED_BREAKPOINT;
       return 0;
   }

Собираем враппер для gdb:

    sudo apt-get install binutils-dev
    git clone git://github.com/kmcallister/embedded-breakpoints.git
    cd embedded-breakpoints
    ./build.sh

Собираем тестовое приложение и запускаем под управлением враппера к gdb:

   $ gcc -g -o example example.c
   $ ./gdb-with-breakpoints ./example

   Reading symbols from example...done.
   Breakpoint 1 at 0x4004f2: file example.c, line 8.
   Breakpoint 2 at 0x4004fc: file example.c, line 10.

   (gdb) run

   Starting program: example 
   Hello,

   Breakpoint 1, main () at example.c:8
   8           printf("world!\\n");

   (gdb) info breakpoints

   Num     Type           Disp Enb Address            What
   1       breakpoint     keep y   0x00000000004004f2 in main at   example.c:8
        breakpoint already hit 1 time
   2       breakpoint     keep y   0x00000000004004fc in main at example.c:10

При выполнении напрямую и или в версии gdb без специального враппера точки
останова никак не отражаются на работе программы.
 
28.11.2012 , Автор: glebiao , Источник: http://mainisusuallyafunction.blogs...
Ключи: gdb, debug, breakpoint / Лицензия: CC-BY
Раздел:    Корень / Программисту и web-разработчику / C/C++, сборка, отладка

Обсуждение [ Линейный режим | Показать все | RSS ]
 
  • 1.1, dkrot, 00:50, 29/11/2012 [ответить] [смотреть все]
  • +/
    С ходу, конечно х. з. какое применение, но реализовано элегантно. Я даже и не знал что есть такая libbfd :-)
     
     
  • 2.2, qux, 13:56, 29/11/2012 [^] [ответить] [смотреть все]
  • +1 +/
    В первоисточние описано более подробно, про зачем больше в комментариях:
    http://mainisusuallyafunction.blogspot.com/2012/01/embedding-gdb-breakpoints-
     
  • 1.3, pavlinux, 20:52, 29/11/2012 [ответить] [смотреть все]
  • +1 +/
    В общем прикольно, но пошагово отлаживать не выходит.

    [code]
    # /gdb-with-breakpoints ./example
    Breakpoint 1 at 0x40054a
    Breakpoint 2 at 0x400554
    (gdb) info b
    Num     Type           Disp Enb Address            What
    1       breakpoint     keep y   0x000000000040054a
    2       breakpoint     keep y   0x0000000000400554
    (gdb) run
    Starting program: /tmp/embedded-breakpoints/example
    Hello,

    Breakpoint 1, 0x000000000040054a in ?? ()
    (gdb) step
    Cannot find bounds of current function
    (gdb) step
    Cannot find bounds of current function
    (gdb)
    ...
    (gdb) continue
    Continuing.
    world!

    Breakpoint 2, 0x0000000000400554 in ?? ()
    (gdb)
    [/code]

     
  • 1.4, svn, 01:31, 01/12/2012 [ответить] [смотреть все]
  • +/
    Какой в этом смысл.

    Стрипнутую проприетарщину без отладочной информации отлаживать?

     
     
  • 2.5, pavlinux, 02:47, 01/12/2012 [^] [ответить] [смотреть все]
  • +1 +/
    > Стрипнутую проприетарщину без отладочной информации отлаживать?

    А теперь ещё раз подумай, но со стороны программиста.

    Я вот не понимаю, че ваще юзера делают на опенете,
    есть же бубнтуфорум, сусефррум, фидорасекта, ...

     
  • 2.6, ram_scan, 20:11, 01/12/2012 [^] [ответить] [смотреть все]  
  • +1 +/
    Смысл такой-же как в отладочных логах.

    Мне например удобнее несколько бряков заэмбедить, чем на каждый отладочный пуск (которых много) заново ставить.

     
     
  • 3.11, прохожий, 10:16, 08/12/2012 [^] [ответить] [смотреть все]  
  • +/
    gdb -x script

    в файле
    source ...
    set args ....
    b $file:line
    ...
    r

    это так сложно создать ?

    на что только не идут люди лишь бы не читать документацию к gdb... один из самых приличных отладчиков

     
     
  • 4.12, ram_scan, 11:41, 10/12/2012 [^] [ответить] [смотреть все]  
  • +/
    Вот только таким макаром нельзя поставить бряк посреди функции. Хотя-бы на том основании что номера строк имеют свойство в процессе написания кода меняться.

    А int3 я в код тыкал еще когда на ассемблере кодил. И находил это очень полезным.

     
  • 2.7, Аноним, 08:40, 04/12/2012 [^] [ответить] [смотреть все]  
  • +/
    Пипец, ты хоть что-то сложнее helloworld.c писал в своей жизни? ТОЛЬКО ЧЕСТНО.
     
     
  • 3.8, gaga, 22:16, 04/12/2012 [^] [ответить] [смотреть все]  
  • +/
    Я писал. И отладчик при этом от силы пару раз использовал, и то чтобы глянуть, что в библиотеке происходит. Тем не менее, нахожу трюк полезным.
     
     
  • 4.10, Карбофос, 01:08, 07/12/2012 [^] [ответить] [смотреть все]  
  • +/
    пропиретарное дебажить нужно, ну или трассировщиком. а такой подход можно только применять для встраивания в исходники, ибо дизасмы, они суровы. или тут есть герои, которые декомпайлеры применяли, а потом с небольшой вставкой обратно собирали и всё работало? ведь об этом речь чел завел, когда заговорил про "стрипнутые" файлы
     
  • 1.9, Аноним, 14:46, 06/12/2012 [ответить] [смотреть все]  
  • +1 +/
    Точки останова для всех запустивших вашу программу из-под wrapper а GDB , даром... весь текст скрыт [показать]
     
  • 1.14, x0r, 10:18, 25/01/2013 [ответить] [смотреть все]  
  • +/
    не получается собрать. поставил binutils и binutils-devel
    Target: x86_64-redhat-linux
    Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-libgcj-multifile --enable-languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk --disable-dssi --disable-plugin --with-java-home=/usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jre --with-cpu=generic --host=x86_64-redhat-linux
    Thread model: posix
    gcc version 4.1.2 20080704 (Red Hat 4.1.2-54)
    [xor@gdrca:~/embedded-breakpoints-master]$ ./build.sh
    + gcc -Wall -std=c99 -lbfd -o gdb-with-breakpoints gdb-with-breakpoints.c
    /tmp/cc6OMnYK.o: In function 'main':
    gdb-with-breakpoints.c:(.text+0x5a): undefined reference to 'bfd_openr'
    gdb-with-breakpoints.c:(.text+0x6f): undefined reference to 'bfd_perror'
     
     
  • 2.15, x0r, 10:19, 25/01/2013 [^] [ответить] [смотреть все]  
  • +/
    libbfd присутствует. что может быть не так?
     
  • 1.16, Rus, 06:25, 05/02/2016 [ответить] [смотреть все]  
  • +/
    Переставь -lbfd в конец:

    gcc -Wall -std=c99 -o gdb-with-breakpoints gdb-with-breakpoints.c -lbfd

     

    Ваш комментарий
    Имя:         
    E-Mail:      
    Заголовок:
    Текст:



      Закладки на сайте
      Проследить за страницей
    Created 1996-2017 by Maxim Chirkov  
    ДобавитьРекламаВебмастеруГИД  
    Hosting by Ihor