Ubuntu 12.04 — Не удается найти точку входа программы в проект C ++

У меня есть проект C ++ в Ubuntu 12.04. Для запуска проекта для файла make требуются следующие файлы:

1-все файлы .cpp

2-Все файлы .h

3-три общие библиотеки.

Проект полностью функционален и выполняется в соответствии со спецификациями. Все необходимые файлы .cpp и .h доступны. Проблема в том, что ни в одном из исходных файлов нет функции main (), а точка входа в программу находится в одной из трех общих библиотек. Моя работа состоит в том, чтобы найти конвейер выполнения программы, и без какого-либо основного файла я не могу это сделать. Я не могу запустить проект в какой-либо IDE (то есть: eclipse), потому что нет доступной основной функции.

Вопрос: Подскажите, пожалуйста, как найти точку входа в программу?

П.С .: Я буду рад предоставить любую информацию или материалы, которые могут вам понадобиться для решения моей проблемы.

редактировать: Доступен файл CMakeLists.txt Вот.

Редактировать 2: Файл build.sh доступен Вот.

2

Решение

Чтобы найти точку входа, загляните в каждый общий объект с помощью:

nm $library | egrep "T main$"

Библиотека с main() будет выводить что-то вроде

090d8ab0 T main

Очень полезный способ визуализации дерева выполнения — запустить:

valgrind --tool=callgrind ./my_executable -arg -arg ....

(вы можете прервать выполнение рано с Ctrl + C,)

Это будет выводить callgrind.<pid> файл. Чтобы визуализировать это, запустите kcachegrind callgrind.<pid>,


Тебе понадобится Valgrind:

sudo apt-get install valgrind

а также KCachegrind

sudo apt-get install kcachegrind
4

Другие решения

Постройте его с опцией отладки -g и войдите в программу с помощью отладчика вроде gdb (или cgdb или ddd). Вам понадобятся любые соответствующие библиотеки библиотек отладки.

Если не считать этого, поиграйте с кодом немного. Попробуйте положить printf или же cout операторы, которые печатают внутренние переменные в любых функциях, которые выглядят важными, и видят, каково состояние программы и как часто они вызываются. Если main скрыт в библиотеке, возможно, где-то есть другая функция, которая ведет себя как main для целей API, предоставляемых любой библиотекой, имеющей реальный main,

Какая документация по API для ваших библиотек? (это школьный проект?). Звучит странно иметь скрытый main и не говори ничего об этом.

0

Если вы используете систему сборки (CMake, SCons, …), вполне возможно, что система сборки также генерирует некоторые файлы, и один из них может содержать main() метод. Мы используем эту методологию при создании функции main для создания экземпляров классов для библиотек, которые были специально выбраны в CMake-gui.

И снова, возможно, что система сборки удалит сгенерированные файлы из-за какой-то непонятной политики, о которой первоначальные разработчики думали, но не говорили вам. Поэтому ищите в файлах вашей системы сборки, смотрите, что там на самом деле происходит.

редактировать

Итак, увидев вас CMakeLists.txt:

проверять ${DIR_EXT}/covis/src/ci.cpp где DIR_EXT является SET( DIR_EXT "../ext/" CACHE PATH "Folder holding external libraries" )

Посмотрите, что там, и дайте нам знать 🙂

Edit2

Увидев build.sh (выполнить шаги по порядку):

1.
менять

`cmake -D COMPILE_BINARY=ON ..`

в

`cmake -D COMPILE_BINARY=ON -DCMAKE_BUILD_TYPE=Debug ..`

и добавить то же самое -DCMAKE_BUILD_TYPE=Debug к другому cmake команда тоже.

Это соберет вашу библиотеку и исполняемый файл в режиме отладки.

2.
Теперь в одном из исходных файлов c ++, к которому у вас есть доступ, и вы уверены, что он будет вызван (чем раньше будет вызвана функция, тем лучше), добавьте:

asm("int $0x03");

Это создаст точку останова в вашем приложении.

(Если вы не хотите использовать это, см. Ниже).

3.
Создайте свое приложение.

4.
Запустите его через отладчик в терминале:

gdb ./myapplication <ENTER>

(это даст вам подсказку GDB)

(если вы не добавили asm Точка останова сверху, введите в приглашении GDB: break filename.cpp:linenumber или же break methodname добавить точку останова GDB).

run <ENTER>

Теперь ваше приложение должно остановиться в вашей функции, когда оно выполнено.
Вы все еще находитесь в приглашении GDB, поэтому введите:

bt <ENTER>

Это распечатает обратный след вашего приложения. Где-то вы должны увидеть основную функцию вместе с именем файла и номером белья.

Однако это setnames.sh выглядит интересно, посмотрите, не смешно ли это 🙂

0
По вопросам рекламы [email protected]