如何在gdb中调用std库函数(c++)?

问题描述 投票:0回答:1

我想使用gdb(使用版本12.1)来调试c++程序(g++版本11.3)。最小可重现示例如下:

// foo.cpp
#include <stdio.h>
#include <math.h>
#include <string>

int main()
{
    int a = std::stoi("2");
    std::printf("%d\n", a);
}

我通过

g++ -ggdb -o foo foo.cpp
编译然后运行
gdb foo
如下

GNU gdb (GDB) 12.1
Copyright (C) 2022 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-conda-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<https://www.gnu.org/software/gdb/bugs/>.
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 foo...
(gdb) b foo.cpp:8
Breakpoint 1 at 0x24bc: file src/foo.cpp, line 8.
(gdb) r
Starting program: /path/redacted/foo 
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".

Breakpoint 1, main () at src/foo.cpp:8
8           std::printf("%d\n", a);
(gdb) p a // just checking the functions worked as expcted
$1 = 2
(gdb) p std::stoi("3")
No symbol "stoi" in namespace "std".

有谁明白为什么我无法调用 gdb 中的

std::stoi
函数?我来自 python,所以这对我来说是一个很奇怪的现象。

我还确认运行

p 'std::stoi[abi:cxx11]'("3")
不起作用如此处讨论的

我尝试在 gdb 中使用

std::stoi
函数,希望它能像我的代码中那样工作。我从 gdb 收到错误

c++ gdb std
1个回答
0
投票

为了 ABI 版本控制,gcc 将

std::stoi
别名为其他命名空间中的实现。例如,在我的安装(Fedora 上的 gcc 13.2)中,如果我这样做
nm -C | grep stoi
,我发现它实际上是:

std::__cxx11::stoi(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long*, int)

要调用它,您需要指定实现的全名:

std::__cxx11::stoi
。此外,gdb 调用 C 和 C++ 函数的代码似乎不提供默认参数,因此您不仅需要指定输入字符串,还需要指定第二个和第三个参数。

但这并不会让你走得更远。它只会给你一条错误消息:“函数调用中的参数太少。”

您可以通过指定第二个和第三个参数来解决这个问题,例如:

p std::__cxx11::stoi("1", (void *)0, 0)
,但这只会给您带来不同的错误消息:“无法将函数 stoi 解析为任何重载实例”。

我尝试过像

(std::string)"1"
这样的显式转换,但这只会产生
invalid cast
错误。尝试使用
std::string("1")
会收到另一条有关表达式中语法错误的错误消息,但仍然不起作用。

所以,这充其量只是部分答案。我从来没有接到实际工作的电话(但至少如果其他人想尝试,他们至少可以从现在开始,而不是从头开始)。

© www.soinside.com 2019 - 2024. All rights reserved.