我有一个C++开源代码,由多个文件中的数千行代码组成,这些代码有助于运行机器人抓手模拟器工具。它有一个前端GUI,可以选择导入各种机械手和物体以及在它们上执行的抓取动作。尽管我已经理解了所使用的一些概念,并通过浏览了解了一些源文件,但我无法了解整个过程的工作原理。我想通过按下一个特定的gui按钮来确定调用了哪些文件和函数。有没有一种方法可以从一开始就调试软件gui代码?
我知道自己写的小代码的编写技术和步骤调试技术,但对于一个有数百个文件和数百个对象的代码来说,这样做太令人困惑了。
此外,调试菜单有两个我可以使用的选项,1-调试项目:在执行此操作时,用户界面窗口将绕过我放置的断点打开。2-步骤进入:它总是从反汇编(主)开始,步骤结束、退出不再是灰色的,我可以使用它们。这是代码的汇编语言吗?有没有更简单的方法来调试它?
任何形式的指导和帮助都将不胜感激。
编辑:下面列出的是开源代码的主文件,由于信誉较差,不能发布带有断点的快照,请在评论中提及。
/*! file
brief Program execution starts here. Server is started, main window is built,
and the interactive loop is started.
The main call returns an exit code as indicated by the graspit GUI (0 by default)
to provide feedback to calling program, if desired.
*/
#define GRASPITDBG
#include <iostream>
#include <graspitApp.h>
#include "graspitGUI.h"
#include "graspitServer.h"
#include "mainWindow.h"
#ifdef Q_WS_WIN
#include <windows.h>
#include <wincon.h>
#endif
int main(int argc, char **argv) {
#ifdef GRASPITDBG
#ifdef Q_WS_WIN
AllocConsole();
freopen("conin$", "r", stdin);
freopen("conout$", "w", stdout);
freopen("conout$", "w", stderr);
//ios::sync_with_stdio();
#endif
#endif
//*******placed breakpoint1
GraspItApp app(argc, argv); //shows the GraspIt! logo splash screen in the
//center of the screen.
if (app.splashEnabled()) {
app.showSplash();
QApplication::setOverrideCursor(Qt::waitCursor);
}
//******* placed breakpoint2
GraspItGUI gui(argc, argv); // Implements the graspit user interface.
// Responsible for creating both MainWindow and IVmgr.
//This is the GraspIt TCP server. It can be used to connect to GraspIt from
//external programs, such as Matlab.
//On some machines, the Q3Socket segfaults at exit, so this is commented out by
//default
//GraspItServer server(4765);
app.setMainWidget(gui.getMainWindow()->mWindow);
QObject::connect(qApp, SIGNAL(lastWindowClosed()), qApp, SLOT(quit()));
if (app.splashEnabled()) {
app.closeSplash();
QApplication::restoreOverrideCursor();
}
if (!gui.terminalFailure()) {
gui.startMainLoop();
}
return gui.getExitCode();
}
GUI按钮通常与回调函数相关联。我会找出哪个函数与感兴趣的按钮相关联,并在那里设置一个断点,然后开始调试。
[EDIT在审核代码后添加]
如果代码中指示的断点不起作用,那么NetBeans项目可能已经以某种方式损坏。例如,仅供参考的
我曾经遇到过同样的问题,但原因不同(NetBeans+CMAKE设置不匹配)。
如果断点正在工作,那么。。
让我们看看GraspItGUI
,例如,如果您在GraspItGUI.cpp
的第86行设置了一个断点(如果版本与此链接相同),它恰好是GraspItGUI::GraspItGUI
的第一个if
-语句,那么程序应该在这一点上停止。