This is the last post of the series showing interesting debugging tools, I hope you have found it useful. Don’t miss the custom scripts at the bottom to process GStreamer logs, help you highlight the interesting parts and find the root cause of difficult bugs. Here are also the previous posts of the series:
- GStreamer WebKit debugging tricks using GDB (1/2)
- GStreamer WebKit debugging tricks using GDB (2/2)
- GStreamer WebKit debugging by instrumenting source code (1/3)
- GStreamer WebKit debugging by instrumenting source code (2/3)
- GStreamer WebKit debugging by instrumenting source code (3/3)
- GStreamer WebKit debugging by using external tools (1/2)
How to debug pkgconfig
When pkg-config
finds the PKG_CONFIG_DEBUG_SPEW
env var, it explains all the steps used to resolve the packages:
PKG_CONFIG_DEBUG_SPEW=1 /usr/bin/pkg-config --libs x11
This is useful to know why a particular package isn’t found and what are the default values for PKG_CONFIG_PATH
when it’s not defined. For example:
Adding directory '/usr/local/lib/x86_64-linux-gnu/pkgconfig' from PKG_CONFIG_PATH Adding directory '/usr/local/lib/pkgconfig' from PKG_CONFIG_PATH Adding directory '/usr/local/share/pkgconfig' from PKG_CONFIG_PATH Adding directory '/usr/lib/x86_64-linux-gnu/pkgconfig' from PKG_CONFIG_PATH Adding directory '/usr/lib/pkgconfig' from PKG_CONFIG_PATH Adding directory '/usr/share/pkgconfig' from PKG_CONFIG_PATH
If we have tuned PKG_CONFIG_PATH
, maybe we also want to add the default paths. For example:
SYSROOT=~/sysroot-x86-64 export PKG_CONFIG_PATH=${SYSROOT}/usr/local/lib/pkgconfig:${SYSROOT}/usr/lib/pkgconfig # Add also the standard pkg-config paths to find libraries in the system export PKG_CONFIG_PATH=${PKG_CONFIG_PATH}:/usr/local/lib/x86_64-linux-gnu/pkgconfig:\ /usr/local/lib/pkgconfig:/usr/local/share/pkgconfig:/usr/lib/x86_64-linux-gnu/pkgconfig:\ /usr/lib/pkgconfig:/usr/share/pkgconfig # This tells pkg-config where the "system" pkg-config dir is. This is useful when cross-compiling for other # architecture, to avoid pkg-config using the system .pc files and mixing host and target libraries export PKG_CONFIG_LIBDIR=${SYSROOT}/usr/lib # This could have been used for cross compiling: #export PKG_CONFIG_SYSROOT_DIR=${SYSROOT}
Man in the middle proxy for WebKit
Sometimes it’s useful to use our own modified/unminified files with a 3rd party service we don’t control. Mitmproxy can be used as a man-in-the-middle proxy, but I haven’t tried it personally yet. What I have tried (with WPE) is this:
- Add an
/etc/hosts
entry to point the host serving the files we want to change to an IP address controlled by us. - Configure a web server to provide the files in the expected path.
- Modify the ResourceRequestBase constructor to change the HTTPS requests to HTTP when the hostname matches the target:
ResourceRequestBase(const URL& url, ResourceRequestCachePolicy policy) : m_url(url) , m_timeoutInterval(s_defaultTimeoutInterval) ... , m_isAppBound(false) { if (m_url.host().toStringWithoutCopying().containsIgnoringASCIICase(String("out-of-control-service.com")) && m_url.protocol().containsIgnoringASCIICase(String("https"))) { printf("### %s: URL %s detected, changing from https to http\n", __PRETTY_FUNCTION__, m_url.string().utf8().data()); fflush(stdout); m_url.setProtocol(String("http")); } }
:bulb: Pro tip: If you have to debug minified/obfuscated JavaScript code and don’t have a deobfuscated version to use in a man-in-the-middle fashion, use http://www.jsnice.org/ to deobfuscate it and get meaningful variable names.
Bandwidth control for a dependent device
If your computer has a “shared internet connection” enabled in Network Manager and provides access to a dependent device , you can control the bandwidth offered to that device. This is useful to trigger quality changes on adaptive streaming videos from services out of your control.
This can be done using tc
, the Traffic Control tool from the Linux kernel. You can use this script to automate the process (edit it to suit to your needs).
Useful scripts to process GStreamer logs
I use these scripts in my daily job to look for strange patterns in GStreamer logs that help me to find the cause of the bugs I’m debugging:
h
: Highlights each expression in the command line in a different color.mgrep
: Greps (only) for the lines with the expressions in the command line and highlights each expression in a different color.filter-time
: Gets a subset of the log lines between a start and (optionally) an end GStreamer log timestamp.highlight-threads
: Highlights each thread in a GStreamer log with a different color. That way it’s easier to follow a thread with the naked eye.remove-ansi-colors
: Removes the color codes from a colored GStreamer log.aha
: ANSI-HTML-Adapter converts plain text with color codes to HTML, so you can share your GStreamer logs from a web server (eg: for bug discussion). Available in most distros.gstbuffer-leak-analyzer
: Analyzes a GStreamer log and shows unbalances in the creation/destruction of GstBuffer and GstMemory objects.