最近的文章
-
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列在其中

-
编译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