2013-06-18 4 views
0

При кодировании C++ в Linux я использую Eclipse CDT. Когда вы переходите к функции C/C++ OS, я могу видеть ассемблер, но, учитывая, что все файлы хранятся в/usr/include /, я думал, что отладчик будет затем входить в каждую строку C/C++.Отладка - переход в функции ОС?

Итак, есть ли способ отладки C++ в Linux, который позволяет вам входить в C/C++ для функций ОС?

+0

Вы не можете запустить отладчик в отношении кода, запущенного в ядре, поскольку он может создать тупик в ядре, если отладчик достигнет точки останова в неудобное время. На многих системах есть отладчик ядра, но он обычно не может ссылаться на код пользователя, а иногда должен быть доступен через последовательный порт с другого компьютера. Если вас интересует отладка ядра ядра в отлаживаемой системе, ознакомьтесь с [DTrace] (http://en.wikipedia.org/wiki/DTrace) в Mac OS X, BSD или Solaris. – Dan

ответ

1

Да, вы можете сделать это с помощью gdb (отладчик GNU) под Linux. Интерфейс довольно груб, но он выполняет эту работу. Небольшой пример: во-первых, запуск gdb.

gdb your_program 

Тогда вы в нем.

.... 
Reading symbols from foobar...done. 
(gdb) start # begin the debug session 
... 
(gdb) disas # show the disassembly code of the current function (main) 
.... # lot of asm 
0x00000000004007d4 <+17>: call 0x400440 <[email protected]> 
0x00000000004007d9 <+22>: mov QWORD PTR [rax],0x0 
0x00000000004007e0 <+29>: push rax 
... # lot of asm 
(gdb) break *0x4007d4 # set a break point at the address of the call malloc 
Breakpoint 2 at 0x4007d4 
(gdb) run # run until breakpoint 
... 
Breakpoint 2, 0x00000000004007d4 in main() # the breakpoint has been reached 
=> 0x00000000004007d4 <main+17>:  e8 67 fc ff ff call 0x400440 <[email protected]> 
(gdb) si # step into the malloc 
0x0000000000400440 in [email protected]() 
=> 0x0000000000400440 <[email protected]+0>: ff 25 92 11 20 00  jmp QWORD PTR [rip+0x201192]  # 0x6015d8 <[email protected]> # you see code from malloc now 
(gdb) ni # next instruction in malloc 
... 
(gdb) finish # quit the current function, actually malloc 
(gdb) 

Однако вы не сможете легко отображать соответствующий исходный код высокого уровня. Лучшее, что вы можете сделать, это одновременно прочитать код библиотеки/ядра.

Например, вы можете прочитать код malloc от glibc (библиотека стандартного C GNU) here, в malloc/malloc.c.

Смежные вопросы