iovisor / bcc

BCC - Tools for BPF-based Linux IO analysis, networking, monitoring, and more
Apache License 2.0
20.3k stars 3.85k forks source link

trace.py can't output full user stack trace #3515

Open b-ripper opened 3 years ago

b-ripper commented 3 years ago

Hi,

I captured the stack trace of the same action. But the user stack trace from trace.py is very short.

Stack traces captured with trace.py:

31325   22575   RenderThread    kgsl_mem_alloc   size is 507904
        b'gpumem_alloc_entry+0x240 [kernel]'
        b'gpumem_alloc_entry+0x240 [kernel]'
        b'kgsl_ioctl_gpuobj_alloc+0x2c [kernel]'
        b'kgsl_ioctl_helper+0x100 [kernel]'
        b'kgsl_ioctl+0x48 [kernel]'
        b'do_vfs_ioctl+0x378 [kernel]'
        b'__arm64_sys_ioctl+0x78 [kernel]'
        b'el0_svc_common+0x9c [kernel]'
        b'el0_svc_handler+0x80 [kernel]'
        b'el0_svc+0x8 [kernel]'
        b'__ioctl+0x8 [libc.so]'
        b'[unknown] [libgsl.so]'
        b'ioctl_kgsl_sharedmem_alloc+0x158 [libgsl.so]'
        b'gsl_memory_alloc_pure+0x5c [libgsl.so]'
        b'[unknown] [libGLESv2_adreno.so]'
        b'[unknown] [libGLESv2_adreno.so]'
        b'[unknown] [libGLESv2_adreno.so]'
        b'[unknown] [libGLESv2_adreno.so]'
        b'[unknown] [libGLESv2_adreno.so]'

Stack traces captured with simpleperf:

RenderThread    22575 [005] 169653.802264:      1 kgsl:kgsl_mem_alloc:
ffffffe16bc19c50    gpumem_alloc_entry ([kernel.kallsyms])
ffffffe16bc19c4e    gpumem_alloc_entry ([kernel.kallsyms])
ffffffe16bc19d12    kgsl_ioctl_gpuobj_alloc ([kernel.kallsyms])
ffffffe16bc223b6    kgsl_ioctl_helper ([kernel.kallsyms])
ffffffe16bc224be    kgsl_ioctl ([kernel.kallsyms])
ffffffe16b710ad6    do_vfs_ioctl ([kernel.kallsyms])
ffffffe16b711606    __arm64_sys_ioctl ([kernel.kallsyms])
ffffffe16b49cfee    el0_svc_common ([kernel.kallsyms])
ffffffe16b49cf46    el0_svc_handler ([kernel.kallsyms])
ffffffe16b484646    el0_svc ([kernel.kallsyms])
      7276c7ca98    __ioctl (/apex/com.android.runtime/lib64/bionic/libc.so)
      7276c39584    ioctl (/apex/com.android.runtime/lib64/bionic/libc.so)
      71d588b5e4    !!!0000!3a4be7d9bfa8ce1de708d9937123e3!cb906521bd! (/vendor/lib64/libgsl.so)
      71d588fc4c    ioctl_kgsl_sharedmem_alloc (/vendor/lib64/libgsl.so)
      71d5760048    gsl_memory_alloc_pure (/vendor/lib64/libgsl.so)
      71d53335c4    !!!0000!032cab158bdf680e30677ffb9724c6!cb906521bd! (/vendor/lib64/egl/libGLESv2_adreno.so)
      71d52f9a74    !!!0000!e35ea7f86ea880357b1b481ca2f0b1!cb906521bd! (/vendor/lib64/egl/libGLESv2_adreno.so)
      71d542cc54    !!!0000!58cf0a22f61be0c18bfabb82068e46!cb906521bd! (/vendor/lib64/egl/libGLESv2_adreno.so)
      71d542e6e4    !!!0000!115befedd67dce09304c97e11cb591!cb906521bd! (/vendor/lib64/egl/libGLESv2_adreno.so)
      71d5384680    !!!0000!0e6b00ab8c4b112f9f6effa6a8b2b5!cb906521bd! (/vendor/lib64/egl/libGLESv2_adreno.so)
      71d53816c8    !!!0000!4ecf3032464df959aad423cba1a73c!cb906521bd! (/vendor/lib64/egl/libGLESv2_adreno.so)
      71d53a019c    !!!0000!141e50cb152287019aff218176d094!cb906521bd! (/vendor/lib64/egl/libGLESv2_adreno.so)
      71d53b8350    !!!0000!838e96e6042a39f699090106d8c25f!cb906521bd! (/vendor/lib64/egl/libGLESv2_adreno.so)
      71d52b6c60    glTexSubImage2D (/vendor/lib64/egl/libGLESv2_adreno.so)
      727407437c    GrGLGpu::uploadTexData(GrGLFormat, GrColorType, int, int, unsigned int, int, int, int, int, GrColorType, GrMipLevel const*, int, GrMipMapsStatus*) (/system/lib64/libhwui.so)
      7273faebdc    GrGpu::writePixels(GrSurface*, int, int, int, int, GrColorType, GrColorType, GrMipLevel const*, int, bool) (/system/lib64/libhwui.so)
      7273fae6f8    GrGpu::createTexture(SkISize, GrBackendFormat const&, GrRenderable, int, SkBudgeted, GrProtected, GrColorType, GrColorType, GrMipLevel const*, int) (/system/lib64/libhwui.so)
      7273fe53fc    GrResourceProvider::createTexture(SkISize, GrBackendFormat const&, GrColorType, GrRenderable, int, SkBudgeted, GrProtected, GrMipLevel const*, int) (/system/lib64/libhwui.so)
      7273fe6220    GrResourceProvider::createTexture(SkISize, GrBackendFormat const&, GrColorType, GrRenderable, int, SkBudgeted, SkBackingFit, GrProtected, GrMipLevel const&) (/system/lib64/libhwui.so)
      7273fc4414    _ZNSt3__110__function6__funcIZN15GrProxyProvider30createNonMippedProxyFromBitmapERK8SkBitmap12SkBackingFitRK15GrBackendFormat11GrColorTypeE3$_0NS_9allocatorISB_EEFN14GrSurfaceProxy18LazyCallbackResultEP18GrResourceProviderEEclEOSH_$54bc43c58c7b81871b96f5561e4dc395 (/system/lib64/libhwui.so)
      7273ff2670    GrSurfaceProxyPriv::doLazyInstantiation(GrResourceProvider*) (/system/lib64/libhwui.so)
      7273fc0f0c    GrProxyProvider::createProxyFromBitmap(SkBitmap const&, GrMipMapped, SkBackingFit) (/system/lib64/libhwui.so)
      7273f8e630    GrBitmapTextureMaker::refOriginalTextureProxyView(bool, GrTextureMaker::AllowedTexGenType) (/system/lib64/libhwui.so)
      7273ffb090    GrTextureMaker::onRefTextureProxyViewForParams(GrSamplerState, bool, float*) (/system/lib64/libhwui.so)
      7273e682ac    SkImage_Raster::onPinAsTexture(GrContext*) const (/system/lib64/libhwui.so)
      7273cb9458    android::uirenderer::skiapipeline::SkiaPipeline::pinImages(std::__1::vector<SkImage*, std::__1::allocator<SkImage*> >&) (/system/lib64/libhwui.so)
      7273c6bbe4    android::uirenderer::skiapipeline::SkiaDisplayList::prepareListAndChildren(android::uirenderer::TreeObserver&, android::uirenderer::TreeInfo&, bool, std::__1::function<void (android::uirenderer::RenderNode*, android::uirenderer::TreeObserver&, android::uirenderer::TreeInfo&, bool)>) (/system/lib64/libhwui.so)
      7273c93850    android::uirenderer::RenderNode::prepareTreeImpl(android::uirenderer::TreeObserver&, android::uirenderer::TreeInfo&, bool, int) (/system/lib64/libhwui.so)
      7273c6bdec    android::uirenderer::skiapipeline::SkiaDisplayList::prepareListAndChildren(android::uirenderer::TreeObserver&, android::uirenderer::TreeInfo&, bool, std::__1::function<void (android::uirenderer::RenderNode*, android::uirenderer::TreeObserver&, android::uirenderer::TreeInfo&, bool)>) (/system/lib64/libhwui.so)
      7273c93850    android::uirenderer::RenderNode::prepareTreeImpl(android::uirenderer::TreeObserver&, android::uirenderer::TreeInfo&, bool, int) (/system/lib64/libhwui.so)
      7273c6bdec    android::uirenderer::skiapipeline::SkiaDisplayList::prepareListAndChildren(android::uirenderer::TreeObserver&, android::uirenderer::TreeInfo&, bool, std::__1::function<void (android::uirenderer::RenderNode*, android::uirenderer::TreeObserver&, android::uirenderer::TreeInfo&, bool)>) (/system/lib64/libhwui.so)
      7273c93850    android::uirenderer::RenderNode::prepareTreeImpl(android::uirenderer::TreeObserver&, android::uirenderer::TreeInfo&, bool, int) (/system/lib64/libhwui.so)
      7273c6bdec    android::uirenderer::skiapipeline::SkiaDisplayList::prepareListAndChildren(android::uirenderer::TreeObserver&, android::uirenderer::TreeInfo&, bool, std::__1::function<void (android::uirenderer::RenderNode*, android::uirenderer::TreeObserver&, android::uirenderer::TreeInfo&, bool)>) (/system/lib64/libhwui.so)
      7273c93850    android::uirenderer::RenderNode::prepareTreeImpl(android::uirenderer::TreeObserver&, android::uirenderer::TreeInfo&, bool, int) (/system/lib64/libhwui.so)
      7273c6bdec    android::uirenderer::skiapipeline::SkiaDisplayList::prepareListAndChildren(android::uirenderer::TreeObserver&, android::uirenderer::TreeInfo&, bool, std::__1::function<void (android::uirenderer::RenderNode*, android::uirenderer::TreeObserver&, android::uirenderer::TreeInfo&, bool)>) (/system/lib64/libhwui.so)
      7273c93850    android::uirenderer::RenderNode::prepareTreeImpl(android::uirenderer::TreeObserver&, android::uirenderer::TreeInfo&, bool, int) (/system/lib64/libhwui.so)
      7273c6bdec    android::uirenderer::skiapipeline::SkiaDisplayList::prepareListAndChildren(android::uirenderer::TreeObserver&, android::uirenderer::TreeInfo&, bool, std::__1::function<void (android::uirenderer::RenderNode*, android::uirenderer::TreeObserver&, android::uirenderer::TreeInfo&, bool)>) (/system/lib64/libhwui.so)
      7273c93850    android::uirenderer::RenderNode::prepareTreeImpl(android::uirenderer::TreeObserver&, android::uirenderer::TreeInfo&, bool, int) (/system/lib64/libhwui.so)
      7273c6bdec    android::uirenderer::skiapipeline::SkiaDisplayList::prepareListAndChildren(android::uirenderer::TreeObserver&, android::uirenderer::TreeInfo&, bool, std::__1::function<void (android::uirenderer::RenderNode*, android::uirenderer::TreeObserver&, android::uirenderer::TreeInfo&, bool)>) (/system/lib64/libhwui.so)
      7273c93850    android::uirenderer::RenderNode::prepareTreeImpl(android::uirenderer::TreeObserver&, android::uirenderer::TreeInfo&, bool, int) (/system/lib64/libhwui.so)
      7273c6bdec    android::uirenderer::skiapipeline::SkiaDisplayList::prepareListAndChildren(android::uirenderer::TreeObserver&, android::uirenderer::TreeInfo&, bool, std::__1::function<void (android::uirenderer::RenderNode*, android::uirenderer::TreeObserver&, android::uirenderer::TreeInfo&, bool)>) (/system/lib64/libhwui.so)
      7273c93850    android::uirenderer::RenderNode::prepareTreeImpl(android::uirenderer::TreeObserver&, android::uirenderer::TreeInfo&, bool, int) (/system/lib64/libhwui.so)
      7273c6bdec    android::uirenderer::skiapipeline::SkiaDisplayList::prepareListAndChildren(android::uirenderer::TreeObserver&, android::uirenderer::TreeInfo&, bool, std::__1::function<void (android::uirenderer::RenderNode*, android::uirenderer::TreeObserver&, android::uirenderer::TreeInfo&, bool)>) (/system/lib64/libhwui.so)
      7273c93850    android::uirenderer::RenderNode::prepareTreeImpl(android::uirenderer::TreeObserver&, android::uirenderer::TreeInfo&, bool, int) (/system/lib64/libhwui.so)
      7273c6bdec    android::uirenderer::skiapipeline::SkiaDisplayList::prepareListAndChildren(android::uirenderer::TreeObserver&, android::uirenderer::TreeInfo&, bool, std::__1::function<void (android::uirenderer::RenderNode*, android::uirenderer::TreeObserver&, android::uirenderer::TreeInfo&, bool)>) (/system/lib64/libhwui.so)
      7273c93850    android::uirenderer::RenderNode::prepareTreeImpl(android::uirenderer::TreeObserver&, android::uirenderer::TreeInfo&, bool, int) (/system/lib64/libhwui.so)
      7273c6bdec    android::uirenderer::skiapipeline::SkiaDisplayList::prepareListAndChildren(android::uirenderer::TreeObserver&, android::uirenderer::TreeInfo&, bool, std::__1::function<void (android::uirenderer::RenderNode*, android::uirenderer::TreeObserver&, android::uirenderer::TreeInfo&, bool)>) (/system/lib64/libhwui.so)
      7273c93850    android::uirenderer::RenderNode::prepareTreeImpl(android::uirenderer::TreeObserver&, android::uirenderer::TreeInfo&, bool, int) (/system/lib64/libhwui.so)
      7273c6bdec    android::uirenderer::skiapipeline::SkiaDisplayList::prepareListAndChildren(android::uirenderer::TreeObserver&, android::uirenderer::TreeInfo&, bool, std::__1::function<void (android::uirenderer::RenderNode*, android::uirenderer::TreeObserver&, android::uirenderer::TreeInfo&, bool)>) (/system/lib64/libhwui.so)
      7273c93850    android::uirenderer::RenderNode::prepareTreeImpl(android::uirenderer::TreeObserver&, android::uirenderer::TreeInfo&, bool, int) (/system/lib64/libhwui.so)
      7273c6bdec    android::uirenderer::skiapipeline::SkiaDisplayList::prepareListAndChildren(android::uirenderer::TreeObserver&, android::uirenderer::TreeInfo&, bool, std::__1::function<void (android::uirenderer::RenderNode*, android::uirenderer::TreeObserver&, android::uirenderer::TreeInfo&, bool)>) (/system/lib64/libhwui.so)
      7273c93850    android::uirenderer::RenderNode::prepareTreeImpl(android::uirenderer::TreeObserver&, android::uirenderer::TreeInfo&, bool, int) (/system/lib64/libhwui.so)
      7273c6bdec    android::uirenderer::skiapipeline::SkiaDisplayList::prepareListAndChildren(android::uirenderer::TreeObserver&, android::uirenderer::TreeInfo&, bool, std::__1::function<void (android::uirenderer::RenderNode*, android::uirenderer::TreeObserver&, android::uirenderer::TreeInfo&, bool)>) (/system/lib64/libhwui.so)
      7273c93850    android::uirenderer::RenderNode::prepareTreeImpl(android::uirenderer::TreeObserver&, android::uirenderer::TreeInfo&, bool, int) (/system/lib64/libhwui.so)
      7273c6bdec    android::uirenderer::skiapipeline::SkiaDisplayList::prepareListAndChildren(android::uirenderer::TreeObserver&, android::uirenderer::TreeInfo&, bool, std::__1::function<void (android::uirenderer::RenderNode*, android::uirenderer::TreeObserver&, android::uirenderer::TreeInfo&, bool)>) (/system/lib64/libhwui.so)
      7273c93850    android::uirenderer::RenderNode::prepareTreeImpl(android::uirenderer::TreeObserver&, android::uirenderer::TreeInfo&, bool, int) (/system/lib64/libhwui.so)
      7273c6bdec    android::uirenderer::skiapipeline::SkiaDisplayList::prepareListAndChildren(android::uirenderer::TreeObserver&, android::uirenderer::TreeInfo&, bool, std::__1::function<void (android::uirenderer::RenderNode*, android::uirenderer::TreeObserver&, android::uirenderer::TreeInfo&, bool)>) (/system/lib64/libhwui.so)
      7273c93850    android::uirenderer::RenderNode::prepareTreeImpl(android::uirenderer::TreeObserver&, android::uirenderer::TreeInfo&, bool, int) (/system/lib64/libhwui.so)
      7273c6bdec    android::uirenderer::skiapipeline::SkiaDisplayList::prepareListAndChildren(android::uirenderer::TreeObserver&, android::uirenderer::TreeInfo&, bool, std::__1::function<void (android::uirenderer::RenderNode*, android::uirenderer::TreeObserver&, android::uirenderer::TreeInfo&, bool)>) (/system/lib64/libhwui.so)
      7273c93850    android::uirenderer::RenderNode::prepareTreeImpl(android::uirenderer::TreeObserver&, android::uirenderer::TreeInfo&, bool, int) (/system/lib64/libhwui.so)
      7273c6bdec    android::uirenderer::skiapipeline::SkiaDisplayList::prepareListAndChildren(android::uirenderer::TreeObserver&, android::uirenderer::TreeInfo&, bool, std::__1::function<void (android::uirenderer::RenderNode*, android::uirenderer::TreeObserver&, android::uirenderer::TreeInfo&, bool)>) (/system/lib64/libhwui.so)
      7273c93850    android::uirenderer::RenderNode::prepareTreeImpl(android::uirenderer::TreeObserver&, android::uirenderer::TreeInfo&, bool, int) (/system/lib64/libhwui.so)
      7273c6bdec    android::uirenderer::skiapipeline::SkiaDisplayList::prepareListAndChildren(android::uirenderer::TreeObserver&, android::uirenderer::TreeInfo&, bool, std::__1::function<void (android::uirenderer::RenderNode*, android::uirenderer::TreeObserver&, android::uirenderer::TreeInfo&, bool)>) (/system/lib64/libhwui.so)
      7273c93850    android::uirenderer::RenderNode::prepareTreeImpl(android::uirenderer::TreeObserver&, android::uirenderer::TreeInfo&, bool, int) (/system/lib64/libhwui.so)
      7273c6bdec    android::uirenderer::skiapipeline::SkiaDisplayList::prepareListAndChildren(android::uirenderer::TreeObserver&, android::uirenderer::TreeInfo&, bool, std::__1::function<void (android::uirenderer::RenderNode*, android::uirenderer::TreeObserver&, android::uirenderer::TreeInfo&, bool)>) (/system/lib64/libhwui.so)
      7273c93850    android::uirenderer::RenderNode::prepareTreeImpl(android::uirenderer::TreeObserver&, android::uirenderer::TreeInfo&, bool, int) (/system/lib64/libhwui.so)
      7273c6bdec    android::uirenderer::skiapipeline::SkiaDisplayList::prepareListAndChildren(android::uirenderer::TreeObserver&, android::uirenderer::TreeInfo&, bool, std::__1::function<void (android::uirenderer::RenderNode*, android::uirenderer::TreeObserver&, android::uirenderer::TreeInfo&, bool)>) (/system/lib64/libhwui.so)
      7273c93850    android::uirenderer::RenderNode::prepareTreeImpl(android::uirenderer::TreeObserver&, android::uirenderer::TreeInfo&, bool, int) (/system/lib64/libhwui.so)
      7273c930dc    android::uirenderer::RenderNode::prepareTree(android::uirenderer::TreeInfo&) (/system/lib64/libhwui.so)
      7273c98acc    android::uirenderer::RootRenderNode::prepareTree(android::uirenderer::TreeInfo&) (/system/lib64/libhwui.so)
      7273cc0ee0    android::uirenderer::renderthread::CanvasContext::prepareTree(android::uirenderer::TreeInfo&, long*, long, android::uirenderer::RenderNode*) (/system/lib64/libhwui.so)
      7273cc3b78    _ZNSt3__110__function6__funcIZN7android10uirenderer12renderthread13DrawFrameTask11postAndWaitEvE3$_0NS_9allocatorIS6_EEFvvEEclEv$c303f2d2360db58ed70a2d0ac7ed911b (/system/lib64/libhwui.so)
      7273cb208c    android::uirenderer::WorkQueue::process() (/system/lib64/libhwui.so)
      7273cd4030    android::uirenderer::renderthread::RenderThread::threadLoop() (/system/lib64/libhwui.so)
      7275bab4cc    android::Thread::_threadLoop(void*) (/system/lib64/libutils.so)
      7275baad90    thread_data_t::trampoline(thread_data_t const*) (/system/lib64/libutils.so)
      7276c9186c    __pthread_start(void*) (/apex/com.android.runtime/lib64/bionic/libc.so)
      7276c31a48    __start_thread (/apex/com.android.runtime/lib64/bionic/libc.so)
yonghong-song commented 3 years ago

@davemarchevsky could you help take a look?

davemarchevsky commented 3 years ago

Hi @b-ripper, some questions:

b-ripper commented 3 years ago

@davemarchevsky Hi, thanks for your response! I traced app com.ss.android.ugc.aweme, using trace.py and simpleperf. The libGLESv2_adreno.so is from qualcomm, an openGL-related library, prebuilt, not open source.

Here I mean, b'[unknown] [libGLESv2_adreno.so]' b'[unknown] [libGLESv2_adreno.so]' b'[unknown] [libGLESv2_adreno.so]' b'[unknown] [libGLESv2_adreno.so]' b'[unknown] [libGLESv2_adreno.so]' from trace.py, is too short, why only 5 lines displayed? could it output more lines?

Another question: Could the "unknown" displayed by address like simpleperf?

davemarchevsky commented 3 years ago

Could the "unknown" displayed by address like simpleperf?

This won't exactly match simpleperf's output, but trace.py's -a flag will print virtual addr for each frame. A separate option to replace [unknown] directly with virtual addr could be useful.

Back to the initial question: Continuing to operate under the assumption that libGLESv2_adreno.so was compiled without frame pointers, the shorter 'broken' stack is expected since the kernel's stack unwinder expects to be able to use the frame pointer to find the next frame, so when it fails to do so in this case it can't find the rest of the frames and just returns what it found.

I spent some time looking at simpleperf's code, looks like it's essentially doing the equivalent of perf's call-graph=dwarf setting. Meaning it asks perf_event_open to grab the entire user stack, instead of walking the stack in kernel space and just returning the frames. Then DWARF-assisted stack walking is done in user space to work around the lack of frame pointers.

We could probably support something similar for the bcc tools, but I'd like to avoid reinventing the wheel by pulling in an existing implementation, and it might require some changes to BPF helpers. Unfortunately this means there's no easy short-term fix for trace.py.

b-ripper commented 3 years ago

@davemarchevsky thanks for your response!

Yes, the stacktrace from simpleperf is from --call-graph=dwarf, if set --call-graph=fp, it will be the same as the trace.py, broken shorter stack. If one library is complied without frame pointers, the fp way will get broken shorter stack?

trace.py's -a flag will print virtual addr for each frame

I tried add -a flag, but not worked.

We could probably support something similar for the bcc tools

Will the dwarf way be supported in long term? And I found eralier issues #1234 , #1803 , #1953 , #2887, which talk about dwarf stacktrace. And also https://github.com/iovisor/bpftrace/issues/1744.

davemarchevsky commented 3 years ago

I tried add -a flag, but not worked.

What's the rest of the trace.py command you're using? I just tried trace.py -U -a do_sys_open and got output with virtual addrs:

1947284 1947289 Watcher         do_sys_open
            7f4373cbe692 b'__open+0xa2 [libpthread-2.30.so]'
                 1bc85ad b'osquery::PlatformFile::PlatformFile(boost::filesystem::path const&, int, int)+0x17d [osqueryd]'
                 1bcd084 b'osquery::readFile(boost::filesystem::path const&, unsigned long, unsigned long, bool, bool, std::function<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, unsigned
 long)>, bool)+0x64 [osqueryd]'

If one library is complied without frame pointers, the fp way will get broken shorter stack?

Yep, specifically we'll never be able to get to root of the stack, or any functions calling into the no-fp library.

Will the dwarf way be supported in long term? And I found eralier issues #1234 , #1803 , #1953 , #2887, which talk about dwarf stacktrace. And also iovisor/bpftrace#1744.

Thank you for linking these! It's definitely worth serious consideration since enough folks across BPF-related projects have requested it. I talked to some other BPF ecosystem folks (@danobi, @yonghong-song, @anakryiko) and there's definitely interest in tackling this in a generalizable way.

One reasonably quick way to solve this for your specific case would be to do something similar to what perf/simpleperf do: grab a big chunk of the stack with a bpf_probe_read_user instead of relying on bpf_get_stack helpers, send it to userspace, and use libunwind to unwind. I think simpleperf's OfflineUnwinder is doing this.

danobi commented 3 years ago

We had some initial discussion and here are my current thoughts: https://dxuuu.xyz/stack-symbolize.html .

May change things later if I have other ideas.

yonghong-song commented 3 years ago

Thanks! cc @davemarchevsky Please make sure the dwarf based stack unwinding also works for bcc. Is it possible we peel out bcc symbolization codes as a separate mini library so it can be reused?

danobi commented 3 years ago

Please make sure the dwarf based stack unwinding also works for bcc

Yeah, will definitely make it work for bcc.

Is it possible we peel out bcc symbolization codes as a separate mini library so it can be reused?

We were thinking of writing the libraries in rust (b/c there's some great rust libraries for DWARF/ELF parsing) and exposing a C interface.

yonghong-song commented 3 years ago

Okay. Thanks.

zhanweiw commented 3 years ago

Is that possible to integrate it to libbpf so that the pure c language also can get the correct user space stack? Thanks.

danobi commented 3 years ago

Is that possible to integrate it to libbpf

It's unlikely we directly add it into libbpf. Better to have a separate library b/c it's not libbpf is not really concerned w/ symbolizing. And not nice to have libbpf users pay for functionality they may not use.

so that the pure c language also can get the correct user space stack? Thanks.

There will be a C interface such that C applications can link against the library.