我在使DMD 2.061在Ubuntu 12.10的配置上运行时遇到问题。
当我第一次使用以下脚本安装它时
if grep -qE "^deb http://d-apt.googlecode.com/files /" /etc/apt/sources.list; then echo "Already there"; else echo 'deb http://d-apt.googlecode.com/files /' | sudo tee -a /etc/apt/sources.list; fi sudo apt-get update -q=2; sudo apt-get --yes --allow-unauthenticated install d-apt-keyring; sudo apt-get update -q=2; sudo apt-get install -y dmd; sudo apt-get install -y libgtkd-dev libgtkd-doc; sudo apt-get install -y libtango-dev libtango-doc; sudo apt-get install -y libdcollections-dev libdcollections-doc; sudo apt-get install -y liborange-dmd-dev liborange-dmd-doc; sudo apt-get install -y libderelict-dev; sudo apt-get install -y libgl3n-dev libgl3n-doc; sudo apt-get install -y libdsqlite-dev libdsqlite-doc; sudo apt-get install -y libspiritd-dev libspiritd-doc; sudo apt-get install -y libdstats-dev libdstats-doc; sudo apt-get install -y libmsgpack-dmd-dev libmsgpack-dmd-doc; sudo apt-get install -y vibe vibe-doc;
一切正常。
但…
然后,当我从一些Ubuntu PPA安装了我最喜欢的软件后,dmd 代码便产生了段错误。由于我使用了大量额外的PPA,因此很难找出导致崩溃的PPA。我已经在默认(未修改)用户上尝试过此操作。
特别是命令
strace -f dmd -run f.d
哪里f.d包含
import std.stdio; void main(string args[]) { auto x = 0b10; writeln(x); }
崩溃为
getrlimit(RLIMIT_STACK, {rlim_cur=8192*1024, rlim_max=RLIM_INFINITY}) = 0 brk(0) = 0x1908000 brk(0x1929000) = 0x1929000 --- SIGSEGV (Segmentation fault) @ 0 (0) --- +++ killed by SIGSEGV (core dumped) +++
我接下来尝试的是比较dmd使用的所有动态库的sha1sum,进而比较我的程序:
linux-vdso.so.1 => (0x00007ffff53ff000) libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f87f0ba0000) libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f87f0983000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f87f0686000) libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f87f0470000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f87f00b1000) /lib64/ld-linux-x86-64.so.2 (0x00007f87f0ecf000)
到我的电视系统上默认安装的没有额外PPA的那些。
事实证明,/usr/lib/x86_64-linux-gnu/libstdc++.so.6并/lib/x86_64-linux-gnu/libgcc_s.so.1有所不同。
因此,我将这些文件复制到我的原始系统中,并使用
LD_PRELOAD=libstdc++.so.6:libgcc_s.so.1
但是…我仍然遇到相同的段错误…而我迷路了。究竟是什么原因会导致此问题?我应该开始比较dmd和程序读取的文件(由strace收集)吗?
我的系统可以在其他地方找到gcc,g ++。因此,我发布此消息是希望我的配置可能在DMD生成的代码中发现一个漏洞。
最后,我在发生故障的系统上打印一些有关编译器版本的默认设置
dummy@lappis:~$ gcc --version gcc-4.7.real (Ubuntu/Linaro 4.7.2-5ubuntu1) 4.7.2 dummy@lappis:~$ dpkg -S /usr/bin/gcc-4.7 diversion by hardening-wrapper from: /usr/bin/gcc-4.7 diversion by hardening-wrapper to: /usr/bin/gcc-4.7.real gcc-4.7, hardening-wrapper: /usr/bin/gcc-4.7
和我的工作(Ubuntu 12.10,没有额外的PPA)
per@buddha:~$ gcc --version gcc (Ubuntu/Linaro 4.7.2-2ubuntu1) 4.7.2 Copyright © 2012 Free Software Foundation, Inc.
根据gdb rdmd运行f.d它崩溃在gc_init():
Program received signal SIGSEGV, Segmentation fault. 0x0000000000417fec in gc_init () (gdb) where #0 0x0000000000417fec in gc_init () #1 0x0000000000416a22 in rt.dmain2._d_run_main() () #2 0x0000000000416546 in rt.dmain2._d_run_main() () #3 0x00000000004164fd in _d_run_main () #4 0x000000000041633b in main ()`
我终于尝试从源代码构建dmd,但结果相同。