最近的文章

  • perfetto源码解析-基础框架(3)

    上篇介绍了traced运行流程和大体框架,本篇将分析producer的启动流程,以heapprofd为例

    代码在src/profiling/memory

    从main函数跟踪,很快就看到启动的主体部分。

    int StartCentralHeapprofd() {
      // We set this up before launching any threads, so we do not have to use a
      // std::atomic for g_dump_evt.
      g_dump_evt = new base::EventFd();
    
      base::UnixTaskRunner task_runner;
      base::Watchdog::GetInstance()->Start();  // crash on exceedingly long tasks
      HeapprofdProducer producer(HeapprofdMode::kCentral, &task_runner,
                                 /* exit_when_done= */ false);
    
      int listening_raw_socket = GetListeningSocket();
      auto listening_socket = base::UnixSocket::Listen(
          base::ScopedFile(listening_raw_socket), &producer.socket_delegate(),
          &task_runner, base::SockFamily::kUnix, base::SockType::kStream);
    
      struct sigaction action = {};
      action.sa_handler = [](int) { g_dump_evt->Notify(); };
      // Allow to trigger a full dump by sending SIGUSR1 to heapprofd.
      // This will allow manually deciding when to dump on userdebug.
      PERFETTO_CHECK(sigaction(SIGUSR1, &action, nullptr) == 0);
      task_runner.AddFileDescriptorWatch(g_dump_evt->fd(), [&producer] {
        g_dump_evt->Clear();
        producer.DumpAll();
      });
      producer.ConnectWithRetries(GetProducerSocket());
      // TODO(fmayer): Create one producer that manages both heapprofd and Java
      // producers, so we do not have two connections to traced.
      JavaHprofProducer java_producer(&task_runner);
      java_producer.ConnectWithRetries(GetProducerSocket());
      task_runner.Run();
      return 0;
    }
    
  • perfetto源码解析-基础框架(2)

    接上篇,看task_runner.Run()做了什么

    代码在src/base/unix_task_runner.cc

    可以看到这里进入了无限循环,先是调用了UpdateWatchTasksLocked,还记得之前看到将socket添加到watch_tasks_里了

    void UnixTaskRunner::Run() {
      PERFETTO_DCHECK_THREAD(thread_checker_);
      created_thread_id_ = GetThreadId();
      quit_ = false;
      for (;;) {
        int poll_timeout_ms;
        {
          std::lock_guard<std::mutex> lock(lock_);
          if (quit_)
            return;
          poll_timeout_ms = GetDelayMsToNextTaskLocked();
          UpdateWatchTasksLocked();
        }
    
  • perfetto源码解析-基础框架(1)

    perfetto是google开源的一套系统级别的性能收集与分析工具。

    笔者试图在源码的层面分析它的工作原理。

    源代码基于AOSP里的external/perfetto版本android-15.0.0_r3。

    下图为Android平台上perfetto的主体框架,通过debug log也把主要的producer和data source列在其中 pic1

  • 编译arm平台Gnu toolchain

    本文描述如何在x86平台编译arm平台使用Gnu toolchain,编译其他平台版本类似。

    首先从ARM Gnu Toolchain下载页面下载源码并解压。

    编译gcc需要gmp,mpc,mpfr模块,从https://ftp.gnu.org/gnu/下载。

    配置并编译gmp,mpc,mpfr:

  • git cherry-pick导致的预期之外的冲突

    在使用git开发时,同事合并分支时遇到了一个奇怪的冲突,不是自己修改的文件,并且此前已确认源分支并没用多于目标分支的修改。

    问题的原因后来发现是cherry-pick和merge的混用导致。

subscribe via RSS