4

我在 virtualenv 中工作时遇到一个非常神秘的错误,该错误间歇性地发生。

尽管它现在已经发生在我身上 3-4 次,但我发现很难找到重现问题的条件。它发生在执行完全不同的代码段时,并且引发错误的同一段代码可能在错误之前和之后多次执行而没有问题。因此,目前对我来说系统地缩小导致问题的库是不切实际的,所以如果我的描述看起来含糊不清或不完整,我提前道歉。

症状

在 IPython 会话期间,我偶尔会遇到重定位错误,这会导致大量 unicode 乱码被转储到我的终端中。这是最近发生问题时的一些终端输出:

In [435]: figs = clustering.make_plots(d[~d.dark_reared], which='dcentre_dangle')
Sliding median, window=10.00, 10116 x-values
     --> Completed: 00:05.17                                               
[Parallel(n_jobs=-1)]: Done   1 jobs       | elapsed:    4.8s
[Parallel(n_jobs=-1)]: Done   3 out of   8 | elapsed:    4.9s remaining:    8.1s
[Parallel(n_jobs=-1)]: Done   8 out of   8 | elapsed:    5.3s finished
/home/alistair/.venvs/rfmap/bin/python/home/alistair/.venvs/rfmap/bin/python: relocation error: /home/alistair/.venvs/rfmap/bin/python: symbol Øv�l��⎼�Ø┴�┌��⎼�Ø┴�┌��⎼�Ø┴�┌��⎼�é����▒└X⎽�▮���\������┴��6�⎼�Ø┴�┌��⎼�Ø┴�┌��⎼�Ø┴�┌��⎼�F��ޚ��7�┴�┌�
�⎼R�A?B�!���≤�├_←▮�┐O��°e�ǐ�┤!�=�'!F─┤�
                                       <b3±_�┴����⎼�Ø┴�┌��⎼�Ø┴�┌��⎼�Ø┴�┌��⎼�Ø┴�┌��⎼�é����▒└X⎽�▮���\������┴��6�⎼�Ø┴�┌��⎼�Ø┴�┌��⎼�Ø┴�┌��⎼�F��ޚ��7�┴�┌��⎼R�A?B�!���≤�├_←▮�┐O��°e�ǐ�┤!�=�'!F─┤�
                                                                                                                                                                                           <b3±_�┴����⎼�Ø┴�┌��⎼�Ø┴�┌��⎼�Ø┴�┌��⎼�Ø┴�┌��⎼�é����▒└
X⎽�▮���\������┴��6�⎼�Ø┴�┌��⎼�Ø┴�┌��⎼�Ø┴�┌��⎼�F��ޚ��7�┴�┌��⎼R�A?B�!���≤�├_←▮�┐O��°e�ǐ�┤!�=�'!F─┤�

......它继续这样持续了好几页。在这种情况下,错误实际上并没有杀死我的 IPython 会话,尽管我的提示现在完全搞砸了:

I┼ [436]: ⎼e┌⎺▒d(c┌┤⎽├e⎼☃┼±)

大概与错误消息一起,一些包含控制字符的二进制数据必须被转储到终端中,因此所有的乱码。

现在,每当我尝试从同一个 virtualenv 中启动 Python 时,都会看到类似的重定位错误:

(rfmap)alistair@MAGICPAVINGSLAB:~/src/python/rfmap_pipeline⟫ python
python: relocation error: python: symbol v�l��⎼�Ø┴�┌��⎼�Ø┴�┌��⎼�Ø┴�┌��⎼�é����▒└X⎽�▮���\������┴��6�⎼�Ø┴�┌��⎼�Ø┴�┌��⎼�Ø┴�┌��⎼�F��ޚ��7�┴�┌��⎼R�A?B�!���≤�├_←▮�┐O��°e�ǐ�┤!�=�'!F─┤�
                                                                                                                                                                               <b3±_�┴����⎼�Ø┴�┌��⎼�Ø┴�┌��⎼�Ø┴�┌��⎼�Ø┴�┌��⎼�Ø┴�┌��⎼�Ø┴�┌��⎼�Ø┴�┌��⎼�Ø┴�┌��⎼�Ø┴�┌��⎼�Ø┴�┌��⎼�Ø┴�┌��⎼�2≥��^Y�(߰⎻≠─�3�C�*��P≤U┼☃c⎺deUCS4_T⎼▒┼⎽┌▒├eC▒▒⎼└▒⎻← ┴e⎼⎽☃⎺┼ GLIBC_2↓2↓5 ┼⎺├ de°☃┼ed ☃┼ °☃┌e ┌☃bc↓⎽⎺↓6 ┬☃├▒ ┌☃┼┐ ├☃└e ⎼e°e⎼e┼ce
(⎼°└▒⎻)127 ▒┌☃⎽├▒☃⎼@MAGICPAVINGSLAB:·/⎽⎼c/⎻≤├▒⎺┼/⎼°└▒⎻_⎻☃⎻e┌☃┼e⟫ 

如果我停用这个 virtualenv 或切换到另一个,Python 可以正常工作。

恢复

发生这种情况的前几次,我只是删除了我的 virtualenv 并从头开始重建它。我最终通过反复试验发现,我也可以通过重新初始化来恢复损坏的 virtualenv,即

~$ virtualenv $VIRTUAL_ENV

它会在其中创建一个新的 Python 二进制文件$VIRTUAL_ENV/bin(并为我提供pipand的新副本setuptools)。

可能的原因?

重新初始化 virtualenv 解决了问题的事实让我相信 Python 二进制文件本身以某种方式被破坏了。尽管我发现健康副本和损坏副本之间的文件大小没有差异,但它们的 MD5 哈希值确实不同。

以前有没有其他人遇到过这种错误?什么可能导致 Python 二进制文件损坏?有问题的机器在其他方面非常稳定——我没有理由怀疑内存或磁盘错误,而且我在系统日志中找不到任何可疑的东西。

以下是一些可能相关的版本详细信息:

  • Ubuntu 15.04 (3.19.0-21-generic)
  • 蟒蛇2.7.9
  • 虚拟环境 1.11.6
  • 虚拟环境包装器 4.3.1

更新:

我尝试区分损坏和未损坏的二进制文件,发现 0xD000 和 0xDFF0 之间的字节块已被重复模式覆盖:

工作副本:

0000 CFC0: 65 74 67 72 6E 61 6D 00  67 65 74 67 72 67 69 64  etgrnam. getgrgid
0000 CFD0: 00 66 73 79 6E 63 00 67  65 74 68 6F 73 74 62 79  .fsync.g ethostby
0000 CFE0: 61 64 64 72 5F 72 00 5F  5F 68 5F 65 72 72 6E 6F  addr_r._ _h_errno
0000 CFF0: 5F 6C 6F 63 61 74 69 6F  6E 00 68 73 74 72 65 72  _locatio n.hstrer
0000 D000: 72 6F 72 00 67 65 74 68  6F 73 74 6E 61 6D 65 00  ror.geth ostname.
0000 D010: 67 65 74 70 77 6E 61 6D  00 73 65 74 75 69 64 00  getpwnam .setuid.
0000 D020: 75 74 69 6D 65 73 00 75  74 69 6D 65 00 73 79 73  utimes.u time.sys
0000 D030: 74 65 6D 00 73 74 72 63  6F 6C 6C 00 77 63 73 63  tem.strc oll.wcsc
0000 D040: 6F 6C 6C 00 61 73 63 74  69 6D 65 00 73 6F 63 6B  oll.asct ime.sock
0000 D050: 65 74 70 61 69 72 00 61  63 63 65 73 73 00 74 65  etpair.a ccess.te
0000 D060: 6D 70 6E 61 6D 00 74 6D  70 66 69 6C 65 36 34 00  mpnam.tm pfile64.
0000 D070: 74 6D 70 6E 61 6D 5F 72  00 66 63 68 64 69 72 00  tmpnam_r .fchdir.
0000 D080: 66 63 68 6D 6F 64 00 66  63 68 6F 77 6E 00 66 64  fchmod.f chown.fd
0000 D090: 61 74 61 73 79 6E 63 00  66 70 61 74 68 63 6F 6E  atasync. fpathcon
0000 D0A0: 66 00 66 73 74 61 74 76  66 73 36 34 00 74 63 67  f.fstatv fs64.tcg
0000 D0B0: 65 74 70 67 72 70 00 74  63 73 65 74 70 67 72 70  etpgrp.t csetpgrp
0000 D0C0: 00 74 74 79 6E 61 6D 65  00 73 65 74 65 67 69 64  .ttyname .setegid
0000 D0D0: 00 73 65 74 65 75 69 64  00 73 65 74 67 69 64 00  .seteuid .setgid.
0000 D0E0: 63 74 65 72 6D 69 64 00  67 65 74 6C 6F 61 64 61  ctermid. getloada
0000 D0F0: 76 67 00 67 65 74 67 72  6F 75 70 73 00 67 65 74  vg.getgr oups.get
0000 D100: 70 70 69 64 00 63 6F 6E  66 73 74 72 00 67 65 74  ppid.con fstr.get
0000 D110: 72 65 73 67 69 64 00 67  65 74 72 65 73 75 69 64  resgid.g etresuid
0000 D120: 00 69 6E 69 74 67 72 6F  75 70 73 00 67 65 74 70  .initgro ups.getp
0000 D130: 77 75 69 64 00 6C 63 68  6F 77 6E 00 73 65 74 72  wuid.lch own.setr
0000 D140: 65 73 67 69 64 00 73 65  74 72 65 73 75 69 64 00  esgid.se tresuid.
0000 D150: 61 6C 61 72 6D 00 73 65  74 70 77 65 6E 74 00 67  alarm.se tpwent.g
0000 D160: 65 74 70 77 65 6E 74 00  65 6E 64 70 77 65 6E 74  etpwent. endpwent
...

损坏的副本:

0000 CFC0: 65 74 67 72 6E 61 6D 00  67 65 74 67 72 67 69 64  etgrnam. getgrgid
0000 CFD0: 00 66 73 79 6E 63 00 67  65 74 68 6F 73 74 62 79  .fsync.g ethostby
0000 CFE0: 61 64 64 72 5F 72 00 5F  5F 68 5F 65 72 72 6E 6F  addr_r._ _h_errno
0000 CFF0: 5F 6C 6F 63 61 74 69 6F  6E 00 68 73 74 72 65 72  _locatio n.hstrer
0000 D000: BE 4A A4 0A 2A 17 AE 18  F9 91 B8 BF 27 5A D7 C9  .J..*... ....'Z..
0000 D010: 98 E5 4B E2 CB 76 84 D3  55 6C BB 8D 0E 72 A2 C3  ..K..v.. Ul...r..
0000 D020: 98 E5 4B E2 CB 76 84 D3  55 6C BB 8D 0E 72 A2 C3  ..K..v.. Ul...r..
0000 D030: 98 E5 4B E2 CB 76 84 D3  55 6C BB 8D 0E 72 A2 C3  ..K..v.. Ul...r..
0000 D040: 98 E5 4B E2 CB 76 84 D3  55 6C BB 8D 0E 72 A2 C3  ..K..v.. Ul...r..
0000 D050: 98 E5 4B E2 CB 76 84 D3  55 6C BB 8D 0E 72 A2 C3  ..K..v.. Ul...r..
0000 D060: 98 E5 4B E2 CB 76 84 D3  55 6C BB 8D 0E 72 A2 C3  ..K..v.. Ul...r..
0000 D070: 98 E5 4B E2 CB 76 84 D3  55 6C BB 8D 0E 72 A2 C3  ..K..v.. Ul...r..
0000 D080: A9 F9 A9 BE 8D 68 6D 58  73 1C 16 C2 E3 95 30 B4  .....hmX s.....0.
0000 D090: 95 96 D3 E0 EA 01 5C B7  CC CE 9C 86 AA AB E9 31  ......\. .......1
0000 D0A0: 98 E5 4B E2 CB 76 84 D3  55 BC 36 85 0E 72 A2 C3  ..K..v.. U.6..r..
0000 D0B0: 98 E5 4B E2 CB 76 84 D3  55 6C BB 8D 0E 72 A2 C3  ..K..v.. Ul...r..
0000 D0C0: 98 E5 4B E2 CB 76 84 D3  55 6C BB 8D 0E 72 A2 C3  ..K..v.. Ul...r..
0000 D0D0: 98 E5 4B E2 CB 76 84 D3  55 6C BB 8D 0E 72 A2 C3  ..K..v.. Ul...r..
0000 D0E0: EE C9 C4 46 D9 4F A6 04  D6 CB BF DE 9A 93 B4 37  ...F.O.. .......7
0000 D0F0: 98 E5 4B E2 CB 76 84 D3  55 6C BB 8D 0E 72 52 FC  ..K..v.. Ul...rR.
0000 D100: CA 59 41 3F 42 94 21 9B  89 80 79 9B 74 D3 1F 5F  .YA?B.!. ..y.t.._
0000 D110: 2C 30 AE 6B 1A 4F F7 B3  14 66 65 BE C7 90 BE 75  ,0.k.O.. .fe....u
0000 D120: 21 8D 3D 1C B6 27 E0 49  15 F3 98 35 21 46 E9 AE  !.=..'.I ...5!F..
0000 D130: D6 71 75 B4 07 0B 3C 62  33 D2 DE 02 67 5F C3 D3  .qu...<b 3...g_..
0000 D140: 98 E5 4B E2 CB 76 84 D3  2A 93 BB 8D 0E 72 A2 C3  ..K..v.. *....r..
0000 D150: 98 E5 4B E2 CB 76 84 D3  55 6C BB 8D 0E 72 A2 C3  ..K..v.. Ul...r..
0000 D160: 98 E5 4B E2 CB 76 84 D3  55 6C BB 8D 0E 72 A2 C3  ..K..v.. Ul...r..
...

我真的没有足够的知识来进一步解释这一点,但似乎位置和模式可能是线索。

4

0 回答 0