У меня есть проект C ++ в Ubuntu 12.04. Для запуска проекта для файла make требуются следующие файлы:
1-все файлы .cpp
2-Все файлы .h
3-три общие библиотеки.
Проект полностью функционален и выполняется в соответствии со спецификациями. Все необходимые файлы .cpp и .h доступны. Проблема в том, что ни в одном из исходных файлов нет функции main (), а точка входа в программу находится в одной из трех общих библиотек. Моя работа состоит в том, чтобы найти конвейер выполнения программы, и без какого-либо основного файла я не могу это сделать. Я не могу запустить проект в какой-либо IDE (то есть: eclipse), потому что нет доступной основной функции.
Вопрос: Подскажите, пожалуйста, как найти точку входа в программу?
П.С .: Я буду рад предоставить любую информацию или материалы, которые могут вам понадобиться для решения моей проблемы.
редактировать: Доступен файл CMakeLists.txt Вот.
Редактировать 2: Файл build.sh доступен Вот.
Чтобы найти точку входа, загляните в каждый общий объект с помощью:
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
Постройте его с опцией отладки -g
и войдите в программу с помощью отладчика вроде gdb (или cgdb или ddd). Вам понадобятся любые соответствующие библиотеки библиотек отладки.
Если не считать этого, поиграйте с кодом немного. Попробуйте положить printf
или же cout
операторы, которые печатают внутренние переменные в любых функциях, которые выглядят важными, и видят, каково состояние программы и как часто они вызываются. Если main
скрыт в библиотеке, возможно, где-то есть другая функция, которая ведет себя как main
для целей API, предоставляемых любой библиотекой, имеющей реальный main
,
Какая документация по API для ваших библиотек? (это школьный проект?). Звучит странно иметь скрытый main
и не говори ничего об этом.
Если вы используете систему сборки (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
выглядит интересно, посмотрите, не смешно ли это 🙂