使用GDB向C++函数传递std::string时找不到构造方法报错的问题咨询
问题根因
- 报错核心是GDB无法匹配到
std::string的拷贝构造函数符号:最后一行调用语句中,值传递参数*$mystr需要调用拷贝构造函数生成临时对象,返回值的类型转换也需要调用构造函数,而C++标准库的相关符号默认可能未导出,或者GDB的类型匹配逻辑没有适配cxx11新ABI的string类型别名。 - 你手动malloc后调用构造函数的写法在部分GDB版本中对
std::__cxx11::basic_string的适配存在缺陷,也会加剧符号匹配失败的问题。
解决方案
方案1:直接传入C字符串(最简单,优先尝试)
GDB默认支持将C风格字符串字面量隐式转换为std::string参数,不需要你手动在堆上构造string对象,直接执行以下命令即可:
call function("foobar")
如果需要接收返回值,用指针承接避免返回值的拷贝构造调用即可:
# 申请内存存储返回的string对象 set $ret_str = (std::string*)malloc(sizeof(std::string)) # 用赋值运算符承接返回值,不需要调用拷贝构造 call $ret_str->operator=(function("foobar")) # 查看返回字符串内容 p $ret_str->c_str()
方案2:指定cxx11 string完整类型名(方案1失效时使用)
如果方案1执行报错,说明GDB无法将std::string别名和你程序中使用的cxx11 ABI的string类型匹配,替换为完整类型名即可:
# 先定义完整类型别名简化后续输入 set $cxx11_string = std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > set $mystr = ($cxx11_string*)malloc(sizeof($cxx11_string)) call $mystr->basic_string() call $mystr->assign("foobar") # 调用函数并用指针承接返回值 set $ret_str = ($cxx11_string*)malloc(sizeof($cxx11_string)) call $ret_str->operator=(function(*$mystr)) # 查看返回值 p $ret_str->c_str()
调试优化配置
如果执行过程中仍然报符号匹配错误,可以先执行以下两条GDB配置命令:
set print object on set overload-resolution off
关闭GDB的自动重载匹配逻辑,强制使用你指定的类型签名匹配函数。
调试结束后可以手动释放申请的内存避免调试态内存泄漏:
call free($mystr) call free($ret_str)
内容的提问来源于stack exchange,提问作者0x92
相关产品推荐
相关产品推荐

