【Chromium】Location信息内核调试

本文探讨了在Chromium浏览器内核开发过程中遇到的问题定位方法,特别是针对内核崩溃(Crash)的情况。通过深入分析Chromium的Looper机制,解释了如何利用Location信息来追踪导致崩溃的具体任务和回调,从而提高调试效率。

Chromium Location信息内核调试

  • 版本:Chromium80
  • 背景:基于Chromium进行浏览器内核开发的时候。有时候内核Crash,解析墓碑仅为PoskTask执行其对应的CallBack时崩溃。而定位问题,需要知道执行的具体任务是什么。
# base/callback.h
class OnceCallback<R(Args...)> : public internal::CallbackBase {
  // Run的时候Crash了。
  R Run(Args... args) && {
  	// 省略
  }
}
  • 首先,简单理解一下Chromium的Looper(这里已经按照个人的理解简易化)。
CallerExecutorLooperPostTaskScheduling Job?loop[ Healthcheck ]ALooper orlibeventRun TaskRun Call Back!If have callback.CallerExecutorLooper
  • 从上图,我们可以看出。再进行问题分析时(如解析墓碑),我们需要知道 Caller与Exccutor的信息。如何,知道两者的信息?使用Location便可以知道。
Location
  • 一般来讲PostTask时,将Location信息传给对应的接口。如
// FROM_HERE 为Location类型
PostTaskOnThread(FROM_HERE, content::BrowserThread::UI,
    base::Bind(&xxxx::func, ptr, args));
  • Location的定义如下:可以获得调用PostTask的函数名、行数、文件名等等。这样,我们便可以知道CallBack执行的Task的具体内容了。
// base/location.h

// Location provides basic info where of an object was constructed, or was
// significantly brought to life.
class BASE_EXPORT Location {
   // 省略
   // Will be nullptr for default initialized Location objects and when source
  // names are disabled.
  const char* function_name() const { return function_name_; }

  // Will be nullptr for default initialized Location objects and when source
  // names are disabled.
  const char* file_name() const { return file_name_; }

  // Will be -1 for default initialized Location objects and when source names
  // are disabled.
  int line_number() const { return line_number_; }

  // The address of the code generating this Location object. Should always be
  // valid except for default initialized Location objects, which will be
  // nullptr.
  const void* program_counter() const { return program_counter_; }

  // Converts to the most user-readable form possible. If function and filename
  // are not available, this will return "pc:<hex address>".
  std::string ToString() const;

}
  • 如果使用?例子如下
// xxx.cc
// 在Chromium源码中加入如下信息
// task->posted_from 为Location类型,此处假设在该文件中已经定义了这个对象。
LOG(INFO) << "HelpInfo:"<< task->posted_from.ToString();
  • 输出信息
[INFO:xxx.cc(99)] HelpInfo:Notify@../../../../../xxxx/chromium/src/mojo/public/cpp/bindings/lib/connector.cc:560
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林多

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值