У меня есть эта крошечная C++ программа в Eclipse IDE, на Ubuntu 13.10 (GCC и g++ 4.8.1):
#include <iostream>
int main() {
int* a = new int(4); //I want to see what happens here at a low-level
std::cout << "!!!Hello World!!!" << std::endl;
return 0;
}
и я хотел бы иметь возможность входить в функцию new(), а затем продолжать делать шаг, насколько я могу, прежде чем начинаю нажимать код сборки. Я пытаюсь понять, что происходит, когда выделена память.
Тем не менее, прямо сейчас, когда я отлаживаю проект и вхожу в строку, содержащую new()
отладчик, просто шаги?
EDIT: Я думаю, что часть ответа состоит в том, что мне действительно нужно установить библиотеки, на которые я хочу вмешаться? а затем, возможно, рассказать Eclipse об этих библиотеках? Это верно? Как мне это сделать?
Некоторые вопросы, чтобы ответить на ваш вопрос.
(Я дал некоторые из них в комментарии, который я удалил с тех пор).
Eclipse не является отладчиком (или компилятором), а просто прославленным редактором (он же IDE). Вам это действительно не нужно (и мне удобнее использовать редактор emacs
для разработки, это действительно вопрос мнения и вкуса). Он предоставляет графический интерфейс для gdb
отладчика GNU (и вы можете использовать gdb
в терминале, запустить его как gdb -tui
) и вашему компилятору g++
(возможно, запустив make
). Вы действительно делаете step
за шагом в код с помощью gdb
. Eclipse просто дает вам красивые кнопки для этого (но работает процесс gdb
).
Вам нужно отлаживать символы и информацию, чтобы step
к некоторой функции, чтобы код был скомпилирован GCC с флагом -g
компилятору.
Вы можете с болью скомпилировать библиотеку GNU libc Glibc и libstdc++
(предоставленную вашей версией компилятора GCC) с помощью отладочных символов...
Вероятно, вы захотите установить отладочные пакеты Debian или Ubuntu libstdc++6-4.8-dbg
и libc6-dbg
которые предоставляют отладочные символы и информацию libstdc++
(для g++-4.8
) и libc6
Вам все равно нужно будет получить исходный код соответствующих libstdc++6-4.8
и libc6
чтобы действительно step
внутрь их исходного кода с легкостью
Вероятно, вы хотите использовать команду set debug-file-directory
(возможно, для /usr/lib/debug
) gdb
; Я не знаю, взаимодействует ли Eclipse. Возможно, использование gdb
непосредственно в терминале проще.
Вы должны использовать valgrind для поиска утечек памяти. Недавний GCC 4.8 также предоставляет вам свой дезинфицирующее средство для адреса (с -fsanitize=address
)
Наконец, ::operator new
- это примитив управления памятью в C++; он обычно вызывает malloc
(реализован в libc6
), который в конечном итоге использует системный вызов mmap (2) (или syscall), атомно предоставляемый ядром linux.
Когда вы укажете "new", компилятор сопоставляет это с вызовом "operator new". Это может быть одна из нескольких вещей, в зависимости от того, выделяете ли вы массив или класс с новым классом или другим. Для new int(4)
вы вызываете:
:operator new(size_t)
Эта функция является частью библиотеки времени выполнения C++. В конце концов, он начинает звонить в malloc
если ему это нравится. По умолчанию эта библиотека не имеет установленных отладочных символов. Если вы хотите отладить его, вам нужно настроить магазин так, как если бы вы были разработчиком библиотеки: загрузите его источник, скомпилируйте его с помощью символов и убедите Eclipse использовать только что созданную версию. Это, конечно, передовая техника. Вам лучше понять, что на самом деле происходит с make
и gdb
прежде чем пытаться использовать Eclipse в этом районе.