在 gdb 中调用 std::~basic_string()

2023-12-05

根据 @EvanED 在https://stackoverflow.com/a/11311786/890753我创建了一个gdb命令newstr创建一个新的 std::string 并将其放入 gdb 便利变量中:

define newstr
set ($arg0)=(std::string*)malloc(sizeof(std::string))
call ($arg0)->basic_string()
# 'assign' returns *this; casting return to void avoids printing of the struct.
call (void)( ($arg0)->assign($arg1) )
end

它效果很好:

(gdb) newstr $foo "hello world"
(gdb) p $foo->c_str()
$57 = 0xb22e388 "hello world"

I use newstr在其他自定义 gdb 命令中,因此为了整洁我还创建了delstr:

define delstr
call ($arg0)->~basic_string($arg0)
call free($arg0)
set ($arg0)=(void*)0
end

它可以工作,但是析构函数调用会产生一条恼人的消息:

(gdb) delstr $foo
warning: Using non-standard conversion to match method std::string::~basic_string to supplied arguments
$62 = 0

我可以避免出现“非标准转换”消息吗? (我使用的是 gdb 7.10。)


TL;DR:通过0到析构函数,而不是$foo.

define delstr
call ($arg0)->~basic_string(0)
#                           ^
call free($arg0)
set ($arg0)=(void*)0
end

好吧,到底发生了什么......我们可以首先检查析构函数的签名。它确实需要一个整数:

(gdb) p ((Foo*) 0)->~Foo
$1 = {void (Foo * const, int)} 0x555555554c00 <Foo::~Foo()>

(gdb) p (('std::__cxx11::string'*) 0)->~basic_string
$2 = {void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > * const, int)} 0x7ffff7b75010 <std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()>

(gdb) ptype Foo
type = struct Foo {
  public:
    Foo(void);
    ~Foo(int);
}

所以“非标准转换”警告是关于将指针转换为整数,这确实是不标准的。 (该警告与析构函数无关。)

但是,出于什么深刻的原因,我们首先需要向析构函数传递一个额外的整数呢?原来是……a bug???? 实际上是一个 GCC 问题(从 gcc 6.3.0 开始),因为使用 clang 编译的同一程序(从 clang 3.8.1 开始)没有额外的内容int争论。


应该知道,在 Italium C++ ABI 中实际上有三个析构函数 (D0、D1、D2).

海湾合作委员会有一个优化-fdeclone-ctor-dtor它将三个析构函数的公共部分重构为“D4”析构函数。这个“D4”析构函数需要一个额外的参数__in_chrg判断D0/D1/D2中哪一个是源,知道是否调用虚基析构函数。

这个“D4”析构函数在某种程度上也被用作 GCC 生成的 DWARF 符号的规范析构函数声明。如果我们检查海湾合作委员会问题从 GDB 错误报告链接来看,使用“D4”的原因是 GCC 开发人员不想选择 D0、D1 或 D2 中的哪一个来祝福。

结果是额外的intGDB 并没有忽视这一点。

The __in_chrg值为2当析构函数能够“完全销毁对象”时(D0,D1),并且0当它只是一个“基本对象析构函数”(D2)时。自从一个std::string没有虚拟基类,你应该通过0到那个论点。


注意:我用这个程序来测试 GDB:

#include <string>
#include <iostream>
std::string aa;
struct Foo {
        Foo() { std::cout << "Constructing: this = " << this << std::endl; }
        ~Foo() { std::cout << "Destroying: this = " << this << std::endl; }
};
int main() {
        Foo foo;
        return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 gdb 中调用 std::~basic_string() 的相关文章

随机推荐

  • vue,如何动态地、以编程方式、单击将组件添加到 DOM 特定位置?

    我需要添加一个动态导入的组件 只需将虚拟标签添加到 DOM 结构中的特定位置即可 不幸的是 我发现的每一种方法都没有解决我的问题 我首先如何尝试 父组件 Editor vue
  • 当子id包含'.'时sql server中的分层排序

    我有一些像下面这样的孩子 childid 1 1 1 2 2 8 2 7 6 5 6 5 1 6 5 15 7 1 8 排序顺序将是 childid 1 1 1 2 2 7 2 8 6 5 6 51 6 5 15 7 1 我尝试转换为整数
  • 是否可以更改毕加索用于图像的缓存大小?

    我正在使用 Picasso 从 URL http 加载图像 有时 当我尝试使用毕加索的 预加载 图像时fetch 方法 图像不会被缓存 我猜是因为它的尺寸太大了 阅读答案this问题 但是setCache 似乎没有被我认可 我什至没有在毕加
  • Python继承结构和参数

    我正在尝试设计一个类结构 允许用户定义自己的类 以重载其他类中的预定义方法 在这种情况下 用户将创建 C 类来重载 D 中的 函数 方法 用户创建的 C 类与其他用户创建的类 A 和 B 具有共同的逻辑 因此它们继承自 C 来重载 函数 但
  • 将测试路径输出重定向到文本文件

    txt 文件只是一堆 UNC 路径 我试图在验证测试路径后将此文本文件中的 UNC 路径列表放入另一个文本文件中 它在屏幕上显示经过验证的路径 但不会填充文本文件 cfgs Get Content cfgpath txt cfgs if T
  • 本地序列不能在查询运算符的 LINQ to SQL 实现中使用(Contains() 运算符除外)

    我在我的项目中使用 LINQ 我的代码是 var SE from c in Shop Sections join c1 in obj SectionObjects on c SectionId equals c1 SectionId sel
  • 为什么我们不能在派生类中使用带参数的构造函数

    为什么这是不可能的 使用构造函数参数实例化 DerivedClass 时出现以下编译器错误 GenericParameterizedConstructor DerivedClass 不包含采用 1 个参数的构造函数 但调用一个非常相似的方法
  • 嵌套环境变量

    我正在尝试制作一个文件 要求您提供用户名和密码并进行注册 注册时 密码保存在变量中 问题是我必须为这些变量设置名称 这些名称将在您写下用户名时输入 例如 我需要用户 john 的密码 当用户写下用户名 john 时 它会存储在变量中 use
  • 表格视图中的滚动底部和性能

    我需要滚动到底部 我有一个聊天应用程序 例如 Whatsapp 因此 当视图出现时 表视图应该显示最后一行 我通过以下行实现了这一点并且效果很好 tableView setContentOffset CGPointMake 0 CGFloa
  • 如何用 Javascript 改变 CSS 样式?

    我有一个像这样的数组 var colors 1 FFFF00 2 FF0000 3 80FF00 4 00FFFF 5 FF00FF JavaScript 是这样的 var color Math floor Math random 5 1
  • 使用 MapStruct 将抽象类映射到 DTO

    我发现了很多与此相关的主题 但在我看来 所有解决方案都走向了错误的方向 那么 在这种情况下我该如何使用 MapStruct 映射 抽象类人 public abstract class Person implements Serializab
  • VB.NET:如何知道哪个系统空闲的时间?

    我正在制作一个正在实施的应用程序自动监控关闭当系统空闲时 即当用户未与系统交互时 我找到了一个链接 http www codeproject com KB system SystemIdleTimerComponent aspx 它确实提供
  • kableextra 表列中的背景颜色

    我有一个简单的 RMarkdown 文档 以 pdf 格式导出 其中包含一个只有 2 列的 kablextra 表 参见图片 我试图将两列的背景设置为蓝色阴影 其中高值用较深的颜色表示 低值用较浅的颜色表示 值的顺序不能更改 因为它们代表月
  • 如何判断两个字符串数组是否等于其他数组[重复]

    这个问题在这里已经有答案了 可能的重复 比较两个 List 是否相等 如何判断两个字符串数组是否相等 我用过这个 但它不起作用 即使两者的内容相同 string array1 new string A B string array2 new
  • 如何通过 flutter 从网站或(网络抓取)收集数据?

    我需要进行网络抓取并从网站收集数据https ipcost com并在我的 Flutter 应用程序中使用收集到的数据 在本例中为我的 IP 详细信息 我的问题是如何获取这些信息并将其显示在用户界面中 我尝试了 web scraper 包
  • 如何确定哪一行导致了 404 错误?

    对于 GET 请求 我遇到了严重的重复错误 404 not found 该调用在 JavaScript 控制台中看起来像这样 GET some path undefined 404 Not Found 它右边的所有内容是 undefined
  • MySQL - 如果表不存在则忽略查询

    我有这张桌子叫tableA它可能不存在于某些数据库中 我希望在执行此操作时忽略选择查询语句tableA数据库中不存在 我尝试从信息模式中选择计数 但其中之一if else声明仍然有select from tableA 这仍然会给我一个错误
  • NSNumberFormatter 用于舍入浮点值

    我有一个 CGFloat 值 我想将其四舍五入到小数点后 3 位数字 我该怎么做 Thanks NSString value NSString stringWithFormat 3f theFloat
  • Grails 2.1 单元测试命令对象 mockForConstraintsTests 不起作用?

    我对此命令对象使用了手动编写以及 Grails 生成的单元测试 package myapp grails validation Validateable class SearchCommand String basisBuild Strin
  • 在 gdb 中调用 std::~basic_string()

    根据 EvanED 在https stackoverflow com a 11311786 890753我创建了一个gdb命令newstr创建一个新的 std string 并将其放入 gdb 便利变量中 define newstr set