Chromium调试时GDB设置URL匹配条件断点报错如何解决?
错误触发原因
该错误是因为你在GDB条件表达式中调用了C++成员函数:
- 首先
resource_request_是std::__Cr::unique_ptr类型,你直接用->访问成员时,GDB需要调用unique_ptr的operator->()成员函数才能拿到原始指针 - 其次
url.spec().find()需要依次调用GURL的spec()成员函数、std::string的find()成员函数
GDB在求值条件表达式时,没有办法安全处理Chromium自定义STL实现的成员函数调用,无法正确构造函数执行的上下文,所以触发了求值错误。
解决方案
推荐两种稳定的实现方式,都可以避免GDB在条件预求值时调用C++成员函数:
方法1:直接访问内部成员改写条件断点
Chromium使用的libcxx版本的unique_ptr内部存储原始指针的成员名为__ptr_,可以直接读取该成员跳过operator->()调用,同时使用libc的strstr函数判断子串存在,避免调用std::string::find:
- 先设置断点,记录GDB返回的断点编号(假设为1)
break SimpleURLLoaderImpl::StartRequest
- 改写条件表达式:
condition 1 strstr(resource_request_.__ptr_->url.spec_.c_str(), "www.googleapis.com") != 0
如果运行时提示找不到spec_成员,可以先断入该函数一次,执行p resource_request_.get()->url查看GURL类中存储完整URL字符串的成员名,替换spec_即可。
方法2:使用断点命令挂钩(更稳定)
给断点附加自动执行的命令,只有命中目标URL时才停留,否则自动继续运行,该方式在断点实际触发后才求值,上下文完整,不会出现调用错误:
- 先设置断点,记录断点编号(假设为1)
break SimpleURLLoaderImpl::StartRequest
- 给断点添加执行命令:
commands 1 silent if strstr(resource_request_.get()->url.spec().c_str(), "www.googleapis.com") != 0 # 符合条件自动停留,无需额外操作 else continue end end
内容的提问来源于stack exchange,提问作者user4331548
相关产品推荐
相关产品推荐

