Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Debugging 如何在ubuntu上使用调试库_Debugging_Ubuntu_Webkit_Gtk - Fatal编程技术网

Debugging 如何在ubuntu上使用调试库

Debugging 如何在ubuntu上使用调试库,debugging,ubuntu,webkit,gtk,Debugging,Ubuntu,Webkit,Gtk,我目前的问题是libwebkitgtk-3.0-0,但我想这个问题已经足够普遍了 我的应用程序在webkit代码的某个地方崩溃了。我的假设是我们正在做一些愚蠢的事情,想知道是什么。最简单的方法是设置断点或使用库的调试版本 如何获得构建库的确切源代码?在转储内核之后,我得到了堆栈跟踪,但行号gdb表示与我在代码中看到的不匹配。换言之,如果我安装libwebkitgtk-3.0-0,我希望获得确切的源代码 我已经安装了webkit库的调试版本。这些调试版本是否具有与使用--enable debug标

我目前的问题是libwebkitgtk-3.0-0,但我想这个问题已经足够普遍了

我的应用程序在webkit代码的某个地方崩溃了。我的假设是我们正在做一些愚蠢的事情,想知道是什么。最简单的方法是设置断点或使用库的调试版本

  • 如何获得构建库的确切源代码?在转储内核之后,我得到了堆栈跟踪,但行号gdb表示与我在代码中看到的不匹配。换言之,如果我安装libwebkitgtk-3.0-0,我希望获得确切的源代码

  • 我已经安装了webkit库的调试版本。这些调试版本是否具有与使用--enable debug标志编译webkit相同的功能?webkit的调试版本基于webkit_调试环境变量启用日志记录,但即使使用库的调试版本,我也无法获得相同的日志记录

  • 如何使用我设法编译的调试版本?我设法在我的机器上编译webkit,并尝试修改加载路径等。无论我做什么,我的应用程序都不会拾取新的共享库-我可以根据用户代理签名来判断。有一次,我设法找到了这个库,但是SSL停止了工作。GtkLauncher也会出现同样的SSL问题。所以我在某个地方犯了错误

  • 感谢您的指点。

    1)当我需要深入研究通过软件包安装的库时,我要做的第一件事就是从源代码处安装它。我的意思是配置/制作/制作安装。我通常将源代码放在/usr/local/src中,然后安装在/usr/local中。在我看来,这是运行源代码的最可靠的方法

    (三)

    如何使用我设法编译的调试版本

    这听起来像是你做了我上面所说的。您需要做的是确保您的软件正在使用承载已编译、已启用调试的库的include和link目录。这意味着确保设置了-I/usr/local/include和-L/usr/local/lib标志,并且它们位于/usr/include和/usr/lib之前

    通过从ubuntu安装中删除二进制版本的库,您可以更加确定,确保您构建和安装的版本是硬盘上唯一的版本。这样,您就可以确定您能够将应用程序配置为使用该库。否则它就会失败,而不是你一直在想它是在使用新库还是旧库

    2) 通常是的。但这取决于库是如何编写的,以及ubuntu打包机决定做什么

    使用本地构建的库编译程序后,首先查看是否得到相同的确切错误。如果不是,那么这也是一个数据点。也许自从上次ubuntu打包这个库以来,这个问题就得到了解决。可能库没有正确打包,这就是问题所在。您甚至可能会出现新的错误,因为ubuntu打包程序以某种方式配置了库,以便它可以工作,而您没有做同样的事情。无论如何,你会得到有趣的线索


    祝你好运;DR:安装,然后您就有了必要的调试符号

    对于调试符号,通常不必从源代码安装。 如您所知,要为您自己构建的软件获取调试符号,您可以使用
    -g
    运行GCC

    对于通过操作系统的软件包管理器(此处包括
    libwebkitgtk-3.0-0
    )安装的软件,至少对于官方软件包,通常还有提供调试符号的软件包

    实际上,在
    gdb
    中获得符号堆栈跟踪不需要程序或库的调试版本
    gdb
    还支持在
    /usr/lib/debug
    中提供“附加”调试符号的文件

    根据你问题上的标签,你使用Ubuntu。在Ubuntu上,调试符号包有两种类型:
    -dbg
    -dbgsym
    。位于路径
    /的程序或库在路径
    /usr/lib/debug/获取调试符号

    -dbg
    软件包 这些包的名称通常不同于提供实际可执行文件或库文件的相应包。它们的名称通常类似于
    -dev
    包(提供头文件)和
    -doc
    包。
    -dbg
    包有时名称中的库版本编号少于实际的库包,有时包含多个其他包中提供的二进制文件

    例如,'s对应的
    -dbg
    包是

    另一方面,有时
    -dbg
    包的名称与它提供符号的包的名称相同(除了
    -dbg
    后缀)。例如,对应的
    -dbg
    包是。
    这就是您想要的

    您可以在软件中心或通过运行以下程序进行安装:

    sudo apt-get update && sudo apt-get install libwebkitgtk-3.0-0-dbg
    
    现在,当您调试链接到
    libwebkitgtk-3.0-0
    提供的库的程序时,
    gdb
    将自动从
    libwebkitgtk-3.0-0-dbg
    提供的文件加载符号

    -dbgsym
    包 有时,官方软件包提供的二进制可执行文件在任何
    -dbg
    软件包中都没有提供符号。发生这种情况时,通常可以安装
    -dbgsym

    -dbg
    包不同,
    -dbgsym
    包:

    • 几乎总是简单地(可预测地)命名为
      X-dbgsym
      ,其中
      X
      是提供程序或库本身的包
    • 由特殊软件源(存储库)提供,而不是提供相应程序的相同软件源
      deb http://ddebs.ubuntu.com YOUR_RELEASE main restricted universe multiverse
      deb http://ddebs.ubuntu.com YOUR_RELEASE-updates main restricted universe multiverse
      deb http://ddebs.ubuntu.com YOUR_RELEASE-security main restricted universe multiverse
      deb http://ddebs.ubuntu.com YOUR_RELEASE-proposed main restricted universe multiverse
      echo "deb http://ddebs.ubuntu.com $(lsb_release -cs) main restricted universe multiverse
      deb http://ddebs.ubuntu.com $(lsb_release -cs)-updates main restricted universe multiverse
      deb http://ddebs.ubuntu.com $(lsb_release -cs)-security main restricted universe multiverse
      deb http://ddebs.ubuntu.com $(lsb_release -cs)-proposed main restricted universe multiverse
      " | sudo tee -a /etc/apt/sources.list.d/ddebs.list
      sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 428D7C01
      sudo apt-get update
      
      $ objdump -g /usr/lib/debug/lib/x86_64-linux-gnu/libc-2.27.so | sed -n '/<.*>\s\+DW_AT_comp_dir/ {s/\s\+<.*>\s\+//; p;}' | sort | uniq
      DW_AT_comp_dir : (indirect string, offset: 0x1127a): /build/glibc-OTsEL5/glibc-2.27/malloc
      ...
      DW_AT_comp_dir : (indirect string, offset: 0xd139): /build/glibc-OTsEL5/glibc-2.27/stdio-common
      DW_AT_comp_dir : (indirect string, offset: 0xef40): /build/glibc-OTsEL5/glibc-2.27/libio
      $ ls -ld glibc-2.27/{stdio-common,libio}
      drwxrwxr-x 3 fusillator fusillator 12288 feb 1 2018 glibc-2.27/libio
      drwxrwxr-x 3 fusillator fusillator 4096 feb 1 2018 glibc-2.27/stdio-common
      $ gdb ./hello
      Reading symbols from ./hello...done.
      (gdb) set substitute-path /build/glibc-OTsEL5/glibc-2.27 glibc-2.27
      (gdb) b main
      Breakpoint 1 at 0x63e: file hello.c, line 10.
      (gdb) run
      Starting program: hello
      Breakpoint 1, main () at hello.c:10
      10 printf("hello world\n");
      (gdb) s
      _IO_puts (str=0x5555555546e4 "hello world") at ioputs.c:33
      33 {
      (gdb) backtrace
      #0 _IO_puts (str=0x5555555546e4 "hello world") at ioputs.c:33
      #1 0x000055555555464a in main () at hello.c:10