Исполняемый файл не найден, когда я передаю `stack exec` опцию` --profile`? - PullRequest
1 голос
/ 05 апреля 2020

Может кто-нибудь помочь мне понять это?

$ stack exec -- mvm4x4_amf +RTS -sstderr
mvm4x4_amf: Most RTS options are disabled. Link with -rtsopts to enable them.

$ stack exec --profile -- mvm4x4_amf +RTS -sstderr                                                                                                         
Executable named mvm4x4_amf not found on path: [{snip}]

Я нашел предложение для второй команды, испробованной выше здесь , в разделе Отладка . (10 из 13 соответствий для поискового запроса: "rts")

После перестройки моего Stack проекта с: stack build --profile, я получаю:

$ stack exec --profile -- mvm4x4_amf +RTS -sstderr                                                                                                         
mvm4x4_amf: Most RTS options are disabled. Link with -rtsopts to enable them.

Если я используйте вместо этого:

$ stack exec --profile mvm4x4_amf +RTS -sstderr

их моя программа запускает, но я не получаю никакой информации о профилировании.

Если я "дохожу" до каталога .stack-work/ и "выполняю" от руки "(как я рекомендовал в некоторых других публикациях, связанных с этой проблемой):

$ .stack-work/dist/x86_64-osx/Cabal-2.4.0.1/build/mvm4x4_amf/mvm4x4_amf +RTS -sstderr
mvm4x4_amf: Most RTS options are disabled. Link with -rtsopts to enable them.

тогда кажется, что мой исполняемый файл не был построен для профилирования. Но попытка явно перестроить его для профилирования не приводит к каким-либо действиям:

$ stack build --profile :mvm4x4_amf

$

О, это вообще помогает? Я заметил кое-что странное:

$ stack build --profile :mvm4x4_amf
luminous-0.5.0.0: unregistering (local file changes: luminous.cabal)
luminous> configure (lib + exe)
Configuring luminous-0.5.0.0...
luminous> build (lib + exe)
Preprocessing library for luminous-0.5.0.0..
Building library for luminous-0.5.0.0..
Preprocessing executable 'mvm4x4_amf' for luminous-0.5.0.0..
Building executable 'mvm4x4_amf' for luminous-0.5.0.0..
luminous> copy/register
Installing library in .../.stack-work/install/x86_64-osx/2428dc603454d346facf6484280fa92531e4d7789d3
3c4dd56c39cf70d79bd7e/8.6.5/lib/x86_64-osx-ghc-8.6.5/luminous-0.5.0.0-9ABiH0AyDmV25JxAv1cFEI                                                              
{snip}
Installing executable mvm4x4_amf in .../.stack-work/install/x86_64-osx/2428dc603454d346facf6484280fa
92531e4d7789d33c4dd56c39cf70d79bd7e/8.6.5/bin                                                                                                             
{snip}
Registering library for luminous-0.5.0.0..

$ stack exec which mvm4x4_amf
.../.stack-work/install/x86_64-osx/9af8b70f7f84a02189b610f95c8d289ab7d743df5c23a5d5d43b30afe0c02b7c/
8.6.5/bin/mvm4x4_amf                                                                                                                                      

Стек, похоже, обнаружил мой исполняемый файл mvm4x4_amf в другом каталоге, чем тот, где он его устанавливает! Я правильно это читаю? Должен ли я быть обеспокоен?

О, для справки:

$ stack --version
Version 2.1.3, Git revision 0fa51b9925decd937e4a993ad90cb686f88fa282 (7739 commits) x86_64 hpack-0.31.2

Ответы [ 2 ]

1 голос
/ 05 апреля 2020

Aha! Вы должны сделать это:

$ stack exec --profile mvm4x4_amf --rts-options -sstderr

С этой командой я получу ожидаемые результаты профилирования:

 294,885,845,152 bytes allocated in the heap
   3,900,063,256 bytes copied during GC
     160,061,616 bytes maximum residency (57 sample(s))
       6,223,696 bytes maximum slop
             152 MB total memory in use (0 MB lost due to fragmentation)

                                     Tot time (elapsed)  Avg pause  Max pause
  Gen  0     282964 colls,     0 par    6.696s   6.863s     0.0000s    0.0013s
  Gen  1        57 colls,     0 par    0.928s   1.048s     0.0184s    0.1195s

  INIT    time    0.000s  (  0.003s elapsed)
  MUT     time  217.655s  (221.658s elapsed)
  GC      time    7.624s  (  7.911s elapsed)
  RP      time    0.000s  (  0.000s elapsed)
  PROF    time    0.000s  (  0.000s elapsed)
  EXIT    time    0.000s  (  0.000s elapsed)
  Total   time  225.279s  (229.571s elapsed)

  %GC     time       0.0%  (0.0% elapsed)

  Alloc rate    1,354,833,854 bytes per MUT second

  Productivity  96.6% of total user, 96.6% of total elapsed

после вывода моей обычной программы.

И также:

$ stack exec --profile which mvm4x4_amf                                                                                                                    
.../.stack-work/install/x86_64-osx/2428dc603454d346facf6484280fa92531e4d7789d33c4dd56c39cf70d79bd7e/
8.6.5/bin/mvm4x4_amf                                                                                                                                      

Итак, я полагаю, опция --profile "направляет" команду stack exec в другой подкаталог install/? Я думаю, это имеет смысл.

0 голосов
/ 08 апреля 2020
$ stack exec -- mvm4x4_amf +RTS -sstderr
mvm4x4_amf: Most RTS options are disabled. Link with -rtsopts to enable them.

$ stack exec --profile -- mvm4x4_amf +RTS -sstderr
Executable named mvm4x4_amf not found on path: [{snip}]

Это происходит потому, что исполняемые файлы, созданные с использованием информации профилирования и без нее, на самом деле очень разные исполняемые файлы. Это связано с тем, что передача информации профилирования очень затратна и, следовательно, может заметно замедлить выполнение, поэтому, когда вы строите без --profile, весь этот дополнительный код лишается производительности.

Ваш второй вызов не удался, потому что у вас не было встроенного исполняющего файла для вашей программы. Проще говоря, в .stack-work имеется несколько каталогов с несколькими наборами двоичных файлов, созданных с различными параметрами, поэтому stack exec --profile ищет в каталоге «profiling binaries», который в вашем случае был пустым.

После перестройки моего проекта Stack с помощью: stack build --profile я получаю:

$ stack exec --profile -- mvm4x4_amf +RTS -sstderr                    
mvm4x4_amf: Most RTS options are disabled. Link with -rtsopts to enable them.

Этот вызов является правильным. Как показывает ошибка, теперь вам нужно собрать свой исполняемый файл с -rtsopts, чтобы заставить свой исполняемый файл принимать параметры RTS, которые вы хотите передать ему.

Если я использую это вместо этого:

$ stack exec --profile mvm4x4_amf +RTS -sstderr

их моя программа работает, но я не получаю никакой информации профилирования.

Здесь проблема в том, что stack является Haskell Сама проблема, поэтому ваши +RTS -sstderr операции потребляются stack, а не передаются в ваш двоичный файл. Вам абсолютно необходимы эти -- (или, альтернативно, вы можете использовать --rts-options <options>, что говорит стеку передавать +RTS <options> в ваш двоичный файл.

...