【Chromium】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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章