"源文件比可执行文件更新",但不是

Mat*_*ell 5 c linux gdb makefile ccache

GDB抱怨我的源文件比可执行文件更新,并且看起来调试信息确实与源文件的旧版本有关,因为gdb在空行上停止:

Program received signal SIGSEGV, Segmentation fault.
0x0000000000000000 in ?? ()
(gdb) up
#1  0x00007ffff7ba2d88 in CBKeyPairGenerate (keyPair=0x602010) at library/src/CBHDKeys.c:246
warning: Source file is more recent than executable.
246
(gdb) list
241             if (versionBytes == CB_HD_KEY_VERSION_TEST_PUBLIC
242                     || versionBytes == CB_HD_KEY_VERSION_TEST_PRIVATE)
243                     return CB_NETWORK_TEST;
244
245             return CB_NETWORK_UNKNOWN;
246
247     }
248
249     uint8_t * CBHDKeyGetPrivateKey(CBHDKey * key) {
250
Run Code Online (Sandbox Code Playgroud)

但是可执行文件比源文件更新,请看这里:

$ ls -l library/src/CBHDKeys.c 
-rw-r--r-- 1 matt matt 9249 Apr 29 22:40 library/src/CBHDKeys.c
$ ls -l bin/noLowerAddressGenerator 
-rwxr-xr-x 1 matt matt 17845 Apr 30 15:52 bin/noLowerAddressGenerator
Run Code Online (Sandbox Code Playgroud)

我尝试重建后make clean,ccache -C但同样的问题发生.当我更新源文件时我只添加了空格,所以程序逻辑保持不变.我觉得它与它有关,但是因为我清除了ccache并清理了构建和bin目录,make clean我不确定会发生什么上.

版本:

  • GNU Make 3.81
  • gcc(Debian 4.8.2-16)4.8.2
  • GNU gdb(GDB)7.6.2(Debian 7.6.2-1)
  • ccache 3.1.9版
  • SolydXK - SMP Debian 3.13.5-1(2014-03-04)

Tob*_*ght 3

也许您没有使用最新编译的代码版本(如果它位于共享库中)。您可以使用它ldd noLowerAddressGenerator来查看程序的库依赖关系;我不知道是否可以从 GDB 内部找到相关的库,但应该有一种方法(如果您知道如何,请评论或编辑)。

如果确实如此,您可能需要set environment LD_LIBRARY_PATH在运行程序之前在 GDB 中将新建的库放在任何已安装的库之前。您可以考虑RPATH在链接时设置 ELF 变量,但这可能没有什么帮助。

另一种可能性是在您知道未安装该库的系统上运行调试器。我使用schroot分离构建/调试/安装环境取得了良好的结果。