Исполняемый файл не найден, когда я передаю `stack exec` параметр `--profile`?

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

$ 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 exec mvm4x4_amf --rts-options --info
 [("GHC RTS", "YES")
 ,("GHC version", "8.6.5")
 ,("RTS way", "rts_v")
 ,("Build platform", "x86_64-apple-darwin")
 ,("Build architecture", "x86_64")
 ,("Build OS", "darwin")
 ,("Build vendor", "apple")
 ,("Host platform", "x86_64-apple-darwin")
 ,("Host architecture", "x86_64")
 ,("Host OS", "darwin")
 ,("Host vendor", "apple")
 ,("Target platform", "x86_64-apple-darwin")
 ,("Target architecture", "x86_64")
 ,("Target OS", "darwin")
 ,("Target vendor", "apple")
 ,("Word size", "64")
 ,("Compiler unregisterised", "NO")
 ,("Tables next to code", "YES")
 ]

Хм, при изменении опции файла кабалы и перестроении я заметил кое-что странное:

$ 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

person dbanas    schedule 05.04.2020    source источник


Ответы (2)


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

$ 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/? Думаю, это имеет смысл.

person dbanas    schedule 05.04.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 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> вашему двоичному файлу.

person kirelagin    schedule 08.04.2020