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
但是可执行文件比源文件更新,请参阅此处:
$ 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
我尝试在make clean
和ccache -C
之后重建,但出现了相同的问题。当我更新源文件时,我只添加了空白,所以程序逻辑保持不变。我觉得这与此有关,但由于我清除了ccache,并使用make clean
清理了构建和bin目录,我不确定发生了什么。
版本:
- 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(
如果代码在共享库中,可能您没有使用最新编译的版本。您可以使用ldd noLowerAddressGenerator
来查看程序的库依赖关系;我不知道是否有可能从GDB内部找到相关的库,但应该有一种方法(如果你知道的话,请评论或编辑(。
如果确实是这种情况,您可能希望在运行程序之前在GDB中set environment LD_LIBRARY_PATH
,将新建的库放在任何已安装的库之前。您可以考虑在链接时设置RPATH
ELF变量,但这可能没有什么帮助。
另一种可能性是在您知道没有安装库的系统上运行调试器。我使用schroot
将构建/调试/安装环境分离,取得了很好的效果。