Как перейти к реализации кода new () в Eclipse в Linux?

0

У меня есть эта крошечная 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 об этих библиотеках? Это верно? Как мне это сделать?

  • 0
    Используйте режим пошаговой инструкции (см. Stackoverflow.com/questions/3112420/… )
  • 0
    @Samuel_xL не дубликат - я не хочу видеть инструкции по сборке. Я хочу увидеть, что именно malloc () делает (но на уровне C)
Показать ещё 8 комментариев
Теги:
malloc
runtime

2 ответа

1

Некоторые вопросы, чтобы ответить на ваш вопрос.

(Я дал некоторые из них в комментарии, который я удалил с тех пор).

  • 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.

1

Когда вы укажете "new", компилятор сопоставляет это с вызовом "operator new". Это может быть одна из нескольких вещей, в зависимости от того, выделяете ли вы массив или класс с новым классом или другим. Для new int(4) вы вызываете:

:operator new(size_t)

Эта функция является частью библиотеки времени выполнения C++. В конце концов, он начинает звонить в malloc если ему это нравится. По умолчанию эта библиотека не имеет установленных отладочных символов. Если вы хотите отладить его, вам нужно настроить магазин так, как если бы вы были разработчиком библиотеки: загрузите его источник, скомпилируйте его с помощью символов и убедите Eclipse использовать только что созданную версию. Это, конечно, передовая техника. Вам лучше понять, что на самом деле происходит с make и gdb прежде чем пытаться использовать Eclipse в этом районе.

  • 0
    что именно "символы"?
  • 0
    Я предполагаю, что самым простым способом было бы загрузить исходные файлы времени выполнения и просто использовать программу, которая позволяет мне сочетать Ctrl + F для каждого определения функции?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню