在未来的共享库加载时使断点挂起? (y 或 [n])[关闭]

Posted

技术标签:

【中文标题】在未来的共享库加载时使断点挂起? (y 或 [n])[关闭]【英文标题】:Make breakpoint pending on future shared library load? (y or [n]) [closed] 【发布时间】:2019-01-12 16:45:53 【问题描述】:

这是我的代码和我的操作,我想一步一步调试我的代码(下面的代码只是一个例子) main.cpp

#include <iostream>
#include <string>

extern int addd(int ,int);

int main()

    std::string str = "Hello";

    std::cout << str << std::endl;

    int a = 10,b = 20;

    std::cout << a + b << std::endl;

    return 0;

opr.cpp

int add(int a,int b)

    return a + b;

我使用模板 makefile 表单 makefiletemplate 只是修改一些不寻常的东西,当我制作 g++ 命令时:

[root@centos-linux-10 52coder]# make
g++ -std=c++11 -g   -O3 -Wall -Wextra      -c opr.cpp -o opr.o
g++ -std=c++11 -g   -O3 -Wall -Wextra      -c main.cpp -o main.o
g++ -std=c++11 -g   -O3 -Wall -Wextra         ./opr.o ./main.o  -Wl,--gc-sections -Wl,--strip-all   -o torun
Type ./torun to execute the program.

我用-O3 2 1,都错了。 我只是想从函数 main 一步一步调试代码,这样的错误:

[root@centos-linux-10 52coder]# gdb torun 
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-110.el7
Copyright (C) 2013 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-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /root/52coder/patchtool...(no debugging symbols found)...done.
(gdb) b main
Function "main" not defined.
Make breakpoint pending on future shared library load? (y or [n]) n
(gdb) b /root/52coder.cpp:8
No symbol table is loaded.  Use the "file" command.
Make breakpoint pending on future shared library load? (y or [n]) n
(gdb) show directories
Source directories searched: $cdir:$cwd

谁能告诉我这个问题我该怎么办,谢谢提前。

【问题讨论】:

您的代码没有调用add 函数。并且要调试代码,不要使用像-O3 这样的优化选项。 避免编译为 root 避免以 root 身份做任何事情 【参考方案1】:

您不能(轻松)调试 stripped 可执行文件。因为GDB调试器需要DWARF里面的调试信息。

因此,只需将您的代码链接到:

 g++ -std=c++11 -g   -O3 -Wall -Wextra ./opr.o ./main.o  -o torun

您可能会发现使用更少的compiler optimizations(例如,最多使用-O0-Og-O1,而不是-O3)更容易调试程序。

PS。有一些方法可以将调试信息放在一个不同的文件中,但这是一个不同的问题(特定于 Linux)。

【讨论】:

你救了我,我从makefile中删除了-Wl,--gc-sections -Wl,--strip-all,谢谢你的回答! makefiletemplate【参考方案2】:

您的源文件不称为/root/52coder.cpp,因此 GDB 不会将其识别为在您的程序调试期间自动加载的源文件也就不足为奇了。

我猜你的意思是b /root/52coder/main.cpp:8 或只是b main.cpp:8

您还需要摆脱 Basile 已经描述的符号剥离,否则调试器将根本无法使用您的源代码,即使文件名正确。

【讨论】:

那是拼写错误,我只是使用正确的路径和名称,也不能使用gdb。原因是Basile Starynkevitch,我只是删除-Wl,--gc-sections -Wl,- -strip-all ,一切正常。

以上是关于在未来的共享库加载时使断点挂起? (y 或 [n])[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

关闭在 GDB 中设置断点的确认 [重复]

如何在共享库中获取正确的函数名?

GDB 跳过共享库断点

使用 Jenkins 从共享文件夹上的存储库中提取时 Git 挂起

如何在 Linux 的 QTCreator 中使用 dlopen 打开的共享库中设置断点

如何在共享库中的确切行号上设置断点?