0
Files
android_webview
apps
ash
base
build
build_overrides
buildtools
cc
chrome
chromecast
chromeos
clank
codelabs
components
content
crypto
dbus
device
docs
accessibility
autofill
chromeos
design
enterprise
experiments
fuchsia
gpu
graphics
images
infra
intl
ios
linux
build_instructions.md
building_debug_gtk.md
cast_build_instructions.md
cert_management.md
chromium_arm.md
chromium_packages.md
crash_dumping.md
debugging.md
debugging_gtk.md
debugging_minidump.md
debugging_ssl.md
dependencies.md
dev_build_as_default_browser.md
development.md
eclipse_dev.md
graphics_pipeline.md
gtk_theme_integration.md
hw_video_decode.md
instrumented_libraries.md
minidump_to_core.md
ozone_drm.md
password_storage.md
pid_namespace_support.md
plugins.md
profiling.md
proxy_config.md
sandbox_ipc.md
suid_sandbox_development.md
sysroot.md
using_a_chroot.md
zygote.md
login
mac
media
memory
memory-infra
patterns
privacy
privacy_budget
process
security
speed
speed_metrics
standards
telemetry_extension
testing
transcripts
ui
updater
webapps
website
workflow
DIR_METADATA
OWNERS
README.md
accessibility.md
ad_tagging.md
adding_to_third_party.md
android_accessing_cpp_enums_in_java.md
android_accessing_cpp_features_in_java.md
android_accessing_cpp_switches_in_java.md
android_build_instructions.md
android_cast_build_instructions.md
android_debugging_instructions.md
android_dynamic_feature_modules.md
android_emulator.md
android_isolated_splits.md
android_jni_ownership_best_practices.md
android_logging.md
android_native_libraries.md
android_studio.md
angle_in_chromium.md
api_keys.md
asan.md
atom.md
benchmark_performance_regressions.md
bitmap_pipeline.md
branch_gardener.md
building_old_revisions.md
callback.md
ccache_mac.md
chrome_browser_design_principles.md
chrome_os_logging.md
chrome_settings.md
chrome_untrusted.md
chromedriver_status.md
chromeos_build_instructions.md
chromeos_glossary.md
chromium_browser_vs_google_chrome.md
cipd_and_3pp.md
cl_respect.md
cl_tips.md
clang.md
clang_code_coverage_wrapper.md
clang_format.md
clang_gardening.md
clang_sheriffing.md
clang_static_analyzer.md
clang_tidy.md
clang_tool_refactoring.md
clangd.md
clion.md
closure_compilation.md
cocoa_tips_and_tricks.md
code_review_owners.md
code_reviews.md
commit_checklist.md
component_build.md
configuration.md
contributing.md
cq_fault_attribution.md
cr_respect.md
cr_user_manual.md
cross_platform_ui.md
cygwin_dll_remapping_failure.md
dangling_ptr.md
dangling_ptr_guide.md
dbus_mojo_connection_service.md
debugging_with_crash_keys.md
dependencies.md
deterministic_builds.md
disassemble_code.md
documentation_best_practices.md
documentation_guidelines.md
early-hints.md
eclipse.md
emacs.md
erc_irc.md
flag_expiry.md
flag_guarding_guidelines.md
flag_ownership.md
frame_trees.md
gardener.md
gcs_dependencies.md
gdbinit.md
get_the_code.md
git_cookbook.md
git_submodules.md
git_tips.md
google_chrome_branded_builds.md
google_play_services.md
graphical_debugging_aid_chromium_views.md
gwp_asan.md
history_manipulation_intervention.md
how_cc_works.md
how_to_add_your_feature_flag.md
how_to_extend_web_test_framework.md
idn.md
initialize_blink_features.md
inlined_stack_traces.md
installation_at_vmware.md
ios_build_instructions.md
ios_infra.md
ios_voiceover.md
kiosk_mode.md
life_of_a_frame.md
lldbinit.md
mac_arm64.md
mac_build_instructions.md
mac_lld.md
modifying_session_history_serialization.md
modules.md
mojo_and_services.md
mojo_ipc_conversion.md
mojo_testing.md
native_relocations.md
navbar.md
navigation-request-navigation-state.gv
navigation-request-navigation-state.png
navigation.md
navigation_concepts.md
network_traffic_annotations.md
no_sources_assignment_filter.md
optimizing_web_uis.md
orderfile.md
origin_trials_integration.md
ozone_overview.md
parsing_test_results.md
pgo.md
piranha_plant.md
process_model_and_site_isolation.md
profiling.md
profiling_content_shell_on_android.md
proxy_auto_config.md
qtcreator.md
release_branch_guidance.md
render-frame-host-lifecycle-state.gv
render-frame-host-lifecycle-state.png
render_document.md
rust-unsafe.md
rust.md
seccomp_sandbox_crash_dumping.md
servicification.md
session_history.md
sheriff.md
shutdown.md
special_case_urls.md
static_initializers.md
sublime_ide.md
system_hardening_features.md
tab_helpers.md
testing_webui.md
threading_and_tasks.md
threading_and_tasks_faq.md
threading_and_tasks_testing.md
toolchain_support.md
tour_of_luci_ui.md
tpm_quick_ref.md
translation_screenshots.md
trusted_types_on_webui.md
unretained_dangling_ptr_guide.md
unsafe_buffers.md
updating_clang.md
updating_clang_format_binaries.md
use_counter_wiki.md
useful_urls.md
user_data_dir.md
user_data_storage.md
user_handle_mapping.md
vanilla_msysgit_workflow.md
vscode.md
vscode_python.md
webui_build_configuration.md
webui_code_sharing.md
webui_explainer.md
webui_in_chrome.md
webui_in_components.md
webui_using_lit.md
webview_policies.md
win_cross.md
win_order_files.md
windows_build_instructions.md
windows_native_window_occlusion_tracking.md
windows_pwa_integration.md
windows_shortcut_and_taskbar_handling.md
windows_split_dll.md
windows_virtual_desktop_handling.md
wmax_tokens.md
working_remotely_with_android.md
writing_clang_plugins.md
extensions
fuchsia_web
gin
google_apis
gpu
headless
infra
internal
ios
ios_internal
ipc
media
mojo
native_client
native_client_sdk
net
pdf
ppapi
printing
remoting
rlz
sandbox
services
signing_keys
skia
sql
storage
styleguide
testing
third_party
tools
ui
url
v8
webkit
.clang-format
.clang-tidy
.clangd
.git-blame-ignore-revs
.gitallowed
.gitattributes
.gitignore
.gitmodules
.gn
.mailmap
.rustfmt.toml
.vpython3
.yapfignore
ATL_OWNERS
AUTHORS
BUILD.gn
CODE_OF_CONDUCT.md
CPPLINT.cfg
CRYPTO_OWNERS
DEPS
DIR_METADATA
LICENSE
LICENSE.chromium_os
OWNERS
PRESUBMIT.py
PRESUBMIT_test.py
PRESUBMIT_test_mocks.py
README.md
WATCHLISTS
codereview.settings
src/docs/linux/building_debug_gtk.md
Tom Anderson 9f5be07962 Move Linux documents to a subdir
There were 32 linux documents in docs. It's getting out of hand, so lets
move them to a subdirectory.

R=sky,jorgelo
CC=thestig
BUG=None

Change-Id: Ib7de415c72fe6ec3c51dc2b28f06b34487b5b6d1
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1974901
Commit-Queue: Thomas Anderson <thomasanderson@chromium.org>
Reviewed-by: Scott Violet <sky@chromium.org>
Reviewed-by: Jorge Lucangeli Obes <jorgelo@chromium.org>
Cr-Commit-Position: refs/heads/master@{#726499}
2019-12-19 20:54:32 +00:00

3.3 KiB

Linux — Building and Debugging GTK

Sometimes installing the debug packages for gtk and glib isn't quite enough. (For instance, if the artifacts from -O2 are driving you bonkers in gdb, you might want to rebuild with -O0.) Here's how to build from source and use your local version without installing it.

[TOC]

32-bit systems

On Ubuntu, to download and build glib and gtk suitable for debugging:

  1. If you don't have a gpg key yet, generate one with gpg --gen-key.

  2. Create file ~/.devscripts containing DEBSIGN_KEYID=yourkey, e.g. DEBSIGN_KEYID=CC91A262 (See http://www.debian.org/doc/maint-guide/ch-build.en.html)

  3. If you're on a 32 bit system, do:

    #!/bin/sh
    set -x
    set -e
    # Workaround for "E: Build-dependencies for glib2.0 could not be satisfied"
    # See also https://bugs.launchpad.net/ubuntu/+source/apt/+bug/245068
    sudo apt-get install libgamin-dev
    sudo apt-get build-dep glib2.0 gtk+2.0
    rm -rf ~/mylibs
    mkdir ~/mylibs
    cd ~/mylibs
    apt-get source glib2.0 gtk+2.0
    cd glib2.0*
    DEB_BUILD_OPTIONS="nostrip noopt debug" debuild
    cd ../gtk+2.0*
    DEB_BUILD_OPTIONS="nostrip noopt debug" debuild
    

This should take about an hour. If it gets stuck waiting for a zombie, you may have to kill its closest parent (the makefile uses subshells, and bash seems to get confused). When I did this, it continued successfully.

At the very end, it will prompt you for the passphrase for your gpg key.

Then, to run an app with those libraries, do e.g.

export LD_LIBRARY_PATH=$HOME/mylibs/gtk+2.0-2.16.1/debian/install/shared/usr/lib:$HOME/mylibs/gtk+2.0-2.20.1/debian/install/shared/usr/lib

gdb ignores that variable, so in the debugger, you would have to do something like

set solib-search-path $HOME/mylibs/gtk+2.0-2.16.1/debian/install/shared/usr/lib:$HOME/mylibs/gtk+2.0-2.20.1/debian/install/shared/usr/lib

See also http://sources.redhat.com/gdb/current/onlinedocs/gdb_17.html

64-bit systems

If you're on a 64 bit system, you can do the above on a 32 bit system, and copy the result. Or try one of the following:

Building your own GTK

apt-get source glib-2.0 gtk+-2.0

export CFLAGS='-m32 -g'
export LDFLAGS=-L/usr/lib32
export LD_LIBRARY_PATH=/work/32/lib
export PKG_CONFIG_PATH=/work/32/lib/pkgconfig

# glib
setarch i386 ./configure --prefix=/work/32 --enable-debug=yes

# gtk
setarch i386 ./configure --prefix=/work/32 --enable-debug=yes --without-libtiff

ia32-libs

Note: Evan tried this and didn't get any debug libs at the end.

Or you could try this instead:

#!/bin/sh
set -x
set -e
sudo apt-get build-dep ia32-libs
rm -rf ~/mylibs
mkdir ~/mylibs
cd ~/mylibs
apt-get source ia32-libs
cd ia32-libs*
DEB_BUILD_OPTIONS="nostrip noopt debug" debuild

By default, this just grabs and unpacks prebuilt libraries; see ia32-libs-2.7ubuntu6/fetch-and-build which documents a BUILD variable which would force actual building. This would take way longer, since it builds dozens of libraries. I haven't tried it yet.

Possible Issues

debuild may fail with

gpg: [stdin]: clearsign failed: secret key not available
debsign: gpg error occurred!  Aborting....

if you forget to create ~/.devscripts with the right contents.

The build may fail with a FAIL: abicheck.sh if gold is your system linker. Use ld instead.