linux - 如何调试作为软件中so文件一部分的cpp文件?

标签 linux visual-studio debugging dll shared-libraries

所以我有这个软件,它有多个 .so 文件。对于其中一个 so 文件,我对代码进行了一些更改,但我想查看 so 文件中文件的逐行执行情况。
只是为了在使用 Visual Studio 时提供引用,我们可以将代码附加到使用 dll 文件的进程,然后一旦附加,我们就在要调试的文件中放置断点,然后跳到下一行。
如何在 Linux 机器上实现相同的目标?有什么技巧可以帮助我吗?
我有一个使用 so 文件的软件,并且 so 文件具有多个 cpp 文件作为其构建的一部分,我想调试该 so 文件中存在的文件。

最佳答案

如果 .so 具有调试信息,那只是微不足道的,您只需使用调试器运行您的应用程序并执行您提到的相同操作,放置一些断点。您有许多调试器和调试选项。例如,您可以从控制台运行 gdb,要求执行应用程序:

>gdb yourAppPath
或附加到正在运行的进程:
>gdb
(gdb) attach runningProcessId
一旦你进入 gdb,你就可以在任何你想要的地方放置断点(你应该阅读 gdb 文档)。
另一种选择是为 gdb 使用 GUI 前端(即:kgdb),here you can find a list of front ends .此外,Linux 上可用的大多数 IDE 都与 gdb 具有良好的图形集成。
现在,如果您的库 (.so) 文件中没有调试符号,则应使用编译器的调试信息生成选项重新编译它们。如果您使用 gcc,它将是 '-g' 。
如果这些库是由你的发行版提供的,它们中的大多数都有单独的调试符号包,一旦你安装了这些包,符号就会可用,gdb 应该自动加载它们。例如,在 OpenSuse 中,您有 glibc 包和包含 glibc 符号的 glibc-debuginfo 包。
这是我的一个项目中 gdb 使用的最小示例:
首先,我使用所有库的搜索路径调用 gdb,因为它们不在系统路径中。如果您的库已“安装”,则可以从系统路径访问它们,您无需指定 LD_LIBRARY_PATH。
>LD_LIBRARY_PATH=.:~/projects/asdstoolkit2/asdscore/:~/projects/asdstoolkit2/asdscrypto:~/projects/asdstoolkit2/asdsnet:~/projects/asdstoolkit2/codb/codb gdb ../clibrarian/clibrarian 

#output

Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "x86_64-suse-linux".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://bugs.opensuse.org/>.
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from ../clibrarian/clibrarian...
(gdb) 

然后你可以调用 start,强制 gdb 加载所有库符号并在程序开始处放置一个断点。 (您也可以在不执行此操作的情况下加载符号,我只是不记得现在如何,请查看文档)。
(gdb)start
Temporary breakpoint 1 at 0x407aa9: file ../../librarian/clibrarian/main.cpp, line 16.
Starting program: /home/pablo/projects/build-librarian-Desktop-Debug/clibrarian/clibrarian 
Missing separate debuginfos, use: zypper install glibc-debuginfo-2.32-1.1.x86_64
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1".

Temporary breakpoint 1, main (argc=1, argv=0x7fffffffdbf8) at ../../librarian/clibrarian/main.cpp:16
16          qputenv("QT_FORCE_STDERR_LOGGING", QByteArray("1"));
Missing separate debuginfos, use: zypper install krb5-debuginfo-1.18.2-3.2.x86_64 libQt5Core5-debuginfo-5.15.1-2.1.x86_64 libQt5Gui5-debuginfo-5.15.1-2.1.x86_64 libQt5Network5-debuginfo-5.15.1-2.1.x86_64 libQt5Sql5-debuginfo-5.15.1-2.1.x86_64 libX11-6-debuginfo-1.6.12-1.1.x86_64 libXau6-debuginfo-1.0.9-1.7.x86_64 libbrotlicommon1-debuginfo-1.0.9-1.1.x86_64 libbrotlidec1-debuginfo-1.0.9-1.1.x86_64 libbz2-1-debuginfo-1.0.8-2.20.x86_64 libcom_err2-debuginfo-1.45.6-1.19.x86_64 libcurl4-debuginfo-7.72.0-1.2.x86_64 libdouble-conversion3-debuginfo-3.1.5-3.4.x86_64 libexiv2-27-debuginfo-0.27.3-2.1.x86_64 libexpat1-debuginfo-2.2.10-1.1.x86_64 libffi8-debuginfo-3.3.git30-1.13.x86_64 libfontconfig1-debuginfo-2.13.1-2.8.x86_64 libfreetype6-debuginfo-2.10.2-1.3.x86_64 libgcc_s1-debuginfo-10.2.1+git583-1.2.x86_64 libglib-2_0-0-debuginfo-2.64.6-1.1.x86_64 libglvnd-debuginfo-1.3.2-2.1.x86_64 libgmp10-debuginfo-6.2.0-3.3.x86_64 libgnutls30-debuginfo-3.6.15-1.1.x86_64 libgpg-error0-debuginfo-1.39-1.1.x86_64 libgraphite2-3-debuginfo-1.3.14-1.2.x86_64 libharfbuzz0-debuginfo-2.7.2-1.1.x86_64 libhogweed6-debuginfo-3.6-1.5.x86_64 libicu67-debuginfo-67.1-2.3.x86_64 libidn12-debuginfo-1.36-1.2.x86_64 libidn2-0-debuginfo-2.3.0-3.2.x86_64 libjpeg8-debuginfo-8.2.2-60.2.x86_64 libldap-2_4-2-debuginfo-2.4.53-57.2.x86_64 liblz4-1-debuginfo-1.9.2-2.1.x86_64 liblzma5-debuginfo-5.2.5-1.16.x86_64 libmodman1-debuginfo-2.0.1-18.10.x86_64 libnettle8-debuginfo-3.6-1.5.x86_64 libopenssl1_1-debuginfo-1.1.1g-2.13.x86_64 libp11-kit0-debuginfo-0.23.20-2.1.x86_64 libpcre2-16-0-debuginfo-10.35-1.4.x86_64 libpng16-16-debuginfo-1.6.37-1.7.x86_64 libpodofo0_9_6-debuginfo-0.9.6-4.8.x86_64 libproxy1-debuginfo-0.4.15-9.1.x86_64 libsasl2-3-debuginfo-2.1.27-3.5.x86_64 libssh4-debuginfo-0.9.5-1.1.x86_64 libstdc++6-debuginfo-10.2.1+git583-1.2.x86_64 libsystemd0-debuginfo-246.6-1.1.x86_64 libtag1-debuginfo-1.11.2~git20190725.79bc9ccf-2.3.x86_64 libtasn1-6-debuginfo-4.16.0-1.6.x86_64 libtiff5-debuginfo-4.1.0-2.4.x86_64 libunistring2-debuginfo-0.9.10-2.8.x86_64 libz1-debuginfo-1.2.11-16.1.x86_64 libzip5-debuginfo-1.7.3-1.2.x86_64 libzstd1-debuginfo-1.4.5-2.4.x86_64

然后你可以列出一个方法源代码:(你可以点击tab键自动完成)
(gdb) list AIcon::AIcon
file: "aicon.cpp", line number: 12, symbol: "AIcon::AIcon()"
7       #include <QTextStream>
8       extern QStringList AIcon_google_catnames;
9       extern QList<QList<GoogleIcon>* > AIcon_google_Cats;
10      static QStringList AIcon_texts=QStringList()<<QString();
11      static QStringList AIcon_files=QStringList()<<QString();
12      AIcon::AIcon()
13      {
14          m_itype=Icon_Null;
15          m_icon=0;
16      }
file: "aicon.cpp", line number: 17, symbol: "AIcon::AIcon(GoogleIcon)"
12      AIcon::AIcon()
13      {
14          m_itype=Icon_Null;
15          m_icon=0;
16      }
17      AIcon::AIcon(GoogleIcon i)
18      {
19          m_itype=Icon_Google;
20          m_icon=i;
21      }
file: "aicon.cpp", line number: 22, symbol: "AIcon::AIcon(QString const&, bool)"
17      AIcon::AIcon(GoogleIcon i)
18      {
19          m_itype=Icon_Google;
20          m_icon=i;
21      }
22      AIcon::AIcon(const QString &text,bool ti)
23      {
24          if (ti)
25              setTextIcon(text);
26          else
file: "aicon.cpp", line number: 29, symbol: "AIcon::AIcon(AI18n::CountryCode)"
24          if (ti)
25              setTextIcon(text);
26          else
27              setFileIcon(text);
28      }
29      AIcon::AIcon(AI18n::CountryCode cc)
30      {
31          setFlagIcon(cc);
32      }
33      AIcon::AIcon(AI18n::LanguageCode cc)
file: "aicon.cpp", line number: 33, symbol: "AIcon::AIcon(AI18n::LanguageCode)"
28      }
29      AIcon::AIcon(AI18n::CountryCode cc)
30      {
31          setFlagIcon(cc);
32      }
33      AIcon::AIcon(AI18n::LanguageCode cc)
34      {
35          setLanguageIcon(cc);
36      }
37

最后你可以放置一个断点并最终继续执行
(gdb) break 35
Breakpoint 2 at 0x7ffff7f04651: file aicon.cpp, line 35.
(gdb) continue

关于linux - 如何调试作为软件中so文件一部分的cpp文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53889192/

相关文章:

android - 3.0内核中的wakelock核心代码和接口(interface)与3.7/3.8有何区别?

c# - Visual Studio 2013 在创建新表时崩溃

visual-studio - 切换结果 Pane SQL 编辑器 Visual Studio 2012 的快捷键

android - 尝试让 USB 调试在 Windows 7 (Android) 上工作时出现问题

c - 如何从 ELF 文件中提取通过编译器优化添加的常量地址?

python - 在 Python 中使用 cat 命令进行打印

php - 即使在 0777 目录中,也不会使用 imagepng 创建 PNG 图像

linux - Maven 构建使用/分配大量内存

visual-studio - Visual Studio 错误 : The "GenerateResource" task failed unexpectedly

c++ - 如何从调试符号中排除外部依赖项?