2011-12-28 50 views
1

通常当使用gdb时,我可以停止执行并重建可执行文件并重新启动而不会丢失我的断点。当我尝试使用具有静态链接库的可执行文件时,出现错误,指出在构建过程中无法打开可执行文件。GDB可以使用静态链接库重新加载可执行文件吗?

一个具体的例子:

的库文件:

libtest.h:

int square(int a); 

libtest.c:

int square(int a) { 
    return a * a; 
} 

该库编译:

gcc -g -c libfile.c 
ar rcs libtest.a libfile.o 

主文件AC包含:

#include <stdio.h> 
#include <stdlib.h> 
#include "libfile.h" 

int main() { 
    printf("2 squared is %d\n", square(2)); 
    return 0; 
} 

该项目是编译和链接如下:

gcc -g -c a.c 
gcc a.o -g --static -L. -ltest -o gdb_test 

如果我加载生成的文件gdb_test到GDB它并不重要,如果它正在运行它不是。只要gdb打开,后续的构建将在链接步骤中失败:

/usr/bin/ld: cannot open output file gdb_test: Permission denied 

有没有办法解决这个问题?我希望能够使用gdb而不必重新启动并释放断点。

回答

1

这可能是GDB或GCC版本的问题;它适用于我:

% gcc -g -c libtest.c 
    gcc -g -c libtest.c 
    % ar rcs libtest.a libtest.o 
    ar rcs libtest.a libtest.o 
    % gcc -g -c -Wall a.c 
    gcc -g -c -Wall a.c 
    % gcc -Wall -g a.o -L. -ltest -o gdb_test 
    gcc -Wall -g a.o -L. -ltest -o gdb_test 
    % ./gdb_test 
    2 squared is 4 
    % gdb ./gdb_test 
    GNU gdb (GDB) 7.3.50.20111117-cvs-debian 
    Copyright (C) 2011 Free Software Foundation, Inc. 
    License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> 
    This is free software: you are free to change and redistribute it. 
    There is NO WARRANTY, to the extent permitted by law. Type "show copying" 
    and "show warranty" for details. 
    This GDB was configured as "x86_64-linux-gnu". 
    For bug reporting instructions, please see: 
    <http://www.gnu.org/software/gdb/bugs/>... 
    Reading symbols from /home/basile/tmp/gdb_test...done. 
    (gdb) r 
    r 
    Starting program: /home/basile/tmp/gdb_test 
    2 squared is 4 
    [Inferior 1 (process 12271) exited normally] 
    (gdb) quit 
    quit 
    % gcc -v 
    gcc -v 
    Using built-in specs. 
    COLLECT_GCC=/usr/bin/gcc-4.6.real 
    COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.6/lto-wrapper 
    Target: x86_64-linux-gnu 
    Configured with: ../src/configure -v --with-pkgversion='Debian 4.6.2-9' 
    --with-bugurl=file:///usr/share/doc/gcc-4.6/README.Bugs 
    --enable-languages=c,c++,fortran,objc,obj-c++,go --prefix=/usr 
    --program-suffix=-4.6 --enable-shared --enable-linker-build-id 
    --with-system-zlib --libexecdir=/usr/lib --without-included-gettext 
    --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.6 
    --libdir=/usr/lib --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug 
    --enable-libstdcxx-time=yes --enable-plugin --enable-objc-gc 
    --with-arch-32=i586 
    --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu 
    --host=x86_64-linux-gnu --target=x86_64-linux-gnu 
    Thread model: posix 
    gcc version 4.6.2 (Debian 4.6.2-9) 

我的系统是Debian/Sid/amd64。 GCC是(Debian 4.6.2-9); ld = binutils = ar是GNU gold(Debian 2.22的GNU Binutils); GDB是GNU gdb(GDB)7.3.50.20111117-cvs-debian; Gnu Libc是(Debian EGLIBC 2.13-24)。内核是Linux的版本3.1.0-1-AMD64(Debian的3.1.5-1)

,我能够从内部GDB重新编译程序并运行它:

% gdb ./gdb_test 
gdb ./gdb_test 
GNU gdb (GDB) 7.3.50.20111117-cvs-debian 
Copyright (C) 2011 Free Software Foundation, Inc. 
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> 
This is free software: you are free to change and redistribute it. 
There is NO WARRANTY, to the extent permitted by law. Type "show copying" 
and "show warranty" for details. 
This GDB was configured as "x86_64-linux-gnu". 
For bug reporting instructions, please see: 
<http://www.gnu.org/software/gdb/bugs/>... 
Reading symbols from /home/basile/tmp/gdb_test...done. 
(gdb) shell gcc -g -c -Wall a.c 
shell gcc -g -c -Wall a.c 
(gdb) r 
r 
Starting program: /home/basile/tmp/gdb_test 
2 squared is 4 
[Inferior 1 (process 12335) exited normally] 
(gdb) shell gcc -Wall -g a.o -L. -ltest -o gdb_test 

shell gcc -Wall -g a.o -L. -ltest -o gdb_test 
(gdb) 
(gdb) r 
r 
`/home/basile/tmp/gdb_test' has changed; re-reading symbols. 
Starting program: /home/basile/tmp/gdb_test 
2 squared is 4 
[Inferior 1 (process 12346) exited normally] 
(gdb) quit 
quit 
    % 
+0

你可能是对的。我使用Ubuntu 10.04和2.6.32-37内核。 GCC为v4.4.3,GDB为v7.1。我想我会等到12月4日的4月份。 – Kenneth 2011-12-28 11:54:03

+0

您可以升级到Ubuntu 11.04,或切换到Linux mint 12,或者花时间重新编译binutils,gdb,gcc(从他们最近的源代码中)。我不认为这是一个内核问题(但我可能是错的)。 – 2011-12-28 11:57:10

+0

@Kenneth:似乎在Ubuntu 10.04.3 2.6.32-37-generic,gcc Ubuntu 4.4.3-4ubuntu5,gdb 7上工作。1-ubuntu,libc Ubuntu EGLIBC 2.11.1-0ubuntu7.8。使用'lsof'检查是否有任何其他进程持有gdb_test – 2011-12-28 13:20:16

1

/usr/bin/ld: cannot open output file gdb_test: Permission denied

这不太可能与GDBld(或其版本)有关,而且与您使用归档库无关。

更可能发生这种情况,因为您正在使用一些“奇怪的”文件系统。也许你正在使用NTFSCIFS挂载? df .说什么?

+0

运行df -T。给ext4。但是,我正在虚拟机上运行操作系统。那有什么可说的吗? – Kenneth 2011-12-29 07:24:34

相关问题