Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
即使在编译时使用-no-pie,gdb也无法插入断点 我试图让GDB在Ubuntu 20.04上使用C++程序。我需要的是能够设置一个断点(例如,break main.cpp:3gdb命令),然后run直到断点,但此时start和run都失败,因为它们“无法插入断点”和“无法访问内存”。对我来说,即使有非常简单的例子,gdb也会失败。这是main.cpp的内容: #include <iostream> int main() { std::cout << "Hello World!"; return 0; }_C++_Gdb - Fatal编程技术网

即使在编译时使用-no-pie,gdb也无法插入断点 我试图让GDB在Ubuntu 20.04上使用C++程序。我需要的是能够设置一个断点(例如,break main.cpp:3gdb命令),然后run直到断点,但此时start和run都失败,因为它们“无法插入断点”和“无法访问内存”。对我来说,即使有非常简单的例子,gdb也会失败。这是main.cpp的内容: #include <iostream> int main() { std::cout << "Hello World!"; return 0; }

即使在编译时使用-no-pie,gdb也无法插入断点 我试图让GDB在Ubuntu 20.04上使用C++程序。我需要的是能够设置一个断点(例如,break main.cpp:3gdb命令),然后run直到断点,但此时start和run都失败,因为它们“无法插入断点”和“无法访问内存”。对我来说,即使有非常简单的例子,gdb也会失败。这是main.cpp的内容: #include <iostream> int main() { std::cout << "Hello World!"; return 0; },c++,gdb,C++,Gdb,没有-没有饼图结果是相同的。有或没有-no pie唯一改变的是十六进制地址,没有-no pie它的值很低,像0x1189(如上所示),没有-no pie它可以是0x401176,但其他一切都完全相同,在这两种情况下,我一直收到“无法访问地址处的内存”警告 如果我使用starti而不是start,它首先会工作,但经过几次nexti迭代后,它会打印通常的消息“cannotinstart breakpoint”: 因此,我可以使用nexti,但不能使用next,显然不能插入断点 我尝试了-Wl,-no

没有
-没有饼图
结果是相同的。有或没有
-no pie
唯一改变的是十六进制地址,没有-no pie它的值很低,像0x1189(如上所示),没有-no pie它可以是0x401176,但其他一切都完全相同,在这两种情况下,我一直收到“无法访问地址处的内存”警告

如果我使用
starti
而不是
start
,它首先会工作,但经过几次
nexti
迭代后,它会打印通常的消息“cannotinstart breakpoint”:

因此,我可以使用
nexti
,但不能使用
next
,显然不能插入断点

我尝试了
-Wl,-no pie
(通过运行
g++-Wl,-no pie-ggdb3-o main.cpp
;添加
-no pie
不会更改任何内容),但此选项会导致一个奇怪的链接器错误:

/usr/bin/ld: cannot find -lgcc_s
/usr/bin/ld: cannot find -lgcc_s
collect2: error: ld returned 1 exit status
当我在谷歌上搜索错误时,我只找到了尝试
-no pie
的建议,而不是
-Wl,-no pie
,并且没有其他解决方案。由于调试C++程序是非常常见的活动,我觉得我缺少了一些明显的东西,但到目前为止我还没有找到解决方案。 为了更容易理解我使用的确切命令,明确我没有混淆目录,并显示我使用的是什么版本的g++和gdb,以下是完整的终端日志:

为了完整起见,我尝试了同样的方法,但没有
-没有馅饼

正如您所看到的,有无
-无饼图的唯一区别是内存地址,但问题和警告是相同的。如果没有
-没有饼状图
,这可能是意料之中的,但我不明白如果我使用
-没有饼状图
编译,为什么会发生这种情况,以及我还可以尝试解决什么问题。

这:

g++-ggdb3-无饼图-o main.cpp

应生成非饼图可执行文件。您应该能够通过查看
readelf-h main | grep'类型:.*EXEC'
(饼图二进制文件具有
ET_DYN
类型)来验证它是否为非饼图

这:

临时断点1位于0x1189:file main.cpp,第3行。

是明确的饼图二进制文件(在
x86\u 64
Linux上,非饼图二进制文件不会有低于
0x40000
的任何代码)

结论:您可能调试了错误的二进制文件(例如,您正在与调试目录不同的目录中编译
main
),或者您没有讲述整个过程。

这是:

g++-ggdb3-无饼图-o main.cpp

应生成非饼图可执行文件。您应该能够通过查看
readelf-h main | grep'类型:.*EXEC'
(饼图二进制文件具有
ET_DYN
类型)来验证它是否为非饼图

这:

临时断点1位于0x1189:file main.cpp,第3行。

是明确的饼图二进制文件(在
x86\u 64
Linux上,非饼图二进制文件不会有低于
0x40000
的任何代码)


结论:您可能调试了错误的二进制文件(例如,您正在与调试目录不同的目录中编译
main
),或者您没有讲述整个过程。

您有没有看过这个和这个。你检查过你的Ubuntu20主机上是否有足够的内存和交换空间吗?@OnkarNMahajan我的RAM大部分是免费的(31.4G中使用了14.2G),我有2G的SSD交换空间,但只要有足够的RAM,交换空间就不重要了。所以你们的链接中提到的问题似乎和我的问题无关。我正在工作站上使用g++9.3.0。我在G++4.7.3的旧笔记本上试用了同样的C++示例,我可以在没有问题的情况下运行GDB,一切都如期完成。但这并没有帮助我找到现代g++的解决方案。我试图用g++8.4.0进行降级和编译,但问题仍然是一样的:
-no-pie
没有效果,
-Wl,-no-pie
导致相同的
ld
错误。你能检查一下g++和gdb是否都引用了Ubuntu软件包(例如,与/usr/local/bin中的安装相反)它们是最新版本吗?@Botje是的,它们来自Ubuntu软件包(在/usr/bin/),因为我自己从未编译过g++/gdb。我可以在另一台同样有Ubuntu 20.04的计算机上重现这个问题,所以它不仅仅是我的工作站。我试图将gdb降级到9.1,但问题仍然存在,所以我重新安装了GDB9.2。目前我正在使用gdb9.2-0ubuntu1~20.04,这是ubuntults的最新版本。我已经试过g++-8和g++-9,所以我决定也试一下g++-10(通过运行
g++-10-ggdb3-no pie-o main.cpp
),但不幸的是,这并没有起到任何作用。你有没有看过这个和这个。你检查过你的Ubuntu20主机上是否有足够的内存和交换空间吗?@OnkarNMahajan我的RAM大部分是免费的(31.4G中使用了14.2G),我有2G的SSD交换空间,但只要有足够的RAM,交换空间就不重要了。所以你们的链接中提到的问题似乎和我的问题无关。我正在工作站上使用g++9.3.0。我在G++4.7.3的旧笔记本上试用了同样的C++示例,我可以在没有问题的情况下运行GDB,一切都如期完成。但这并没有帮助我找到现代g++的解决方案。我试图用g++8.4.0进行降级和编译,但问题仍然是一样的:
-no-pie
没有效果,
-Wl,-no-pie
会导致相同的
ld
错误。你能检查一下g++和gdb是否都引用了Ubuntu包(例如,与/usr/local/bin中的安装相反)和t
gdb -q main
Reading symbols from main...
(gdb) starti
Starting program: /tmp/main 

Program stopped.
0x00007ffff7fd0100 in ?? () from /lib64/ld-linux-x86-64.so.2
(gdb) nexti
0x00007ffff7fd0103 in ?? () from /lib64/ld-linux-x86-64.so.2
...
(gdb) nexti
Warning:
Cannot insert breakpoint 0.
Cannot access memory at address 0x4

0x00007ffff7fd0119 in ?? () from /lib64/ld-linux-x86-64.so.2
(gdb) nexti
0x00007ffff7fd011c in ?? () from /lib64/ld-linux-x86-64.so.2
...
(gdb) nexti
Warning:
Cannot insert breakpoint 0.
Cannot access memory at address 0x1c

0x000055555556ca22 in ?? ()
(gdb) nexti
[Detaching after fork from child process 3829827]
...
[Detaching after fork from child process 3829840]
Hello World![Inferior 1 (process 3819010) exited normally]
/usr/bin/ld: cannot find -lgcc_s
/usr/bin/ld: cannot find -lgcc_s
collect2: error: ld returned 1 exit status
$ ls
main.cpp
$ g++ --version | grep Ubuntu
g++ (Ubuntu 9.3.0-10ubuntu2) 9.3.0
$ g++ -ggdb3 -no-pie -o main main.cpp
$ ls
main  main.cpp
$ gdb --version | grep Ubuntu
GNU gdb (Ubuntu 9.2-0ubuntu1~20.04) 9.2
$ readelf -h main | grep 'Type: .*EXEC'
  Type:                              EXEC (Executable file)
$ gdb -q main
Reading symbols from main...
(gdb) start
Temporary breakpoint 1 at 0x401176: file main.cpp, line 3.
Starting program: /tmp/main/main 
Warning:
Cannot insert breakpoint 1.
Cannot access memory at address 0x401176
$ rm main
$ g++ -ggdb3 -o main main.cpp
$ readelf -h main | grep 'Type: .*'
  Type:                              DYN (Shared object file)
$ gdb -q main
Reading symbols from main...
(gdb) start
Temporary breakpoint 1 at 0x1189: file main.cpp, line 3.
Starting program: /tmp/main/main 
Warning:
Cannot insert breakpoint 1.
Cannot access memory at address 0x1189