Трассировку выполненных программ называет сценарий Bash

Я обнаружил, что это интересная проблема. Установление максимума и минимума каждого броска не так очевидно, как можно было бы сначала догадаться.

function repeatRolls(cnt) {
  var cnt= cnt || 100;
  var mindie=100000;
  var maxdie=-100000;
  var s='<style>th,td{border: 1px solid black;padding:5px;}</style><table>';
  for(var i=0;i<cnt;i++) {
    var rObj=rollTheDice(12,-12,20);
    if(i==0) {
      s+='<tr><th>Roll</th>';
      for(var k=0;k<rObj.roll.length;k++) {
        s+=Utilities.formatString('<th>Die %s</th>',k+1);
      }
      s+='<th>Sum</th></tr>';
    }
    s+=Utilities.formatString('<tr><td>%s</td>',i+1);
    for(var j=0;j<rObj.roll.length;j++) {
      s+=Utilities.formatString('<td>%s</td>', rObj.roll[j]);
      if(rObj.roll[j]>maxdie){maxdie=rObj.roll[j];}
      if(rObj.roll[j]<mindie){mindie=rObj.roll[j];}
    }
    s+=Utilities.formatString('<td>%s</td></tr>',rObj.total);
  }
  s+=Utilities.formatString('</table><br />maxdie: %s<br />mindie: %s',maxdie,mindie);
  var userInterface=HtmlService.createHtmlOutput(s).setWidth(1200);
  SpreadsheetApp.getUi().showModelessDialog(userInterface, 'Rolling the Dice');
}

Функция крена с максимальным штампом, минимальным штампом и количеством параметров кубиков, которые действительно работают.

function getSum(total,num) {
  return total + num;
}

function rollTheDice(max,min,num) {
  var num = num || 6;
  var min = min || 1;
  var max = max || 6
  var roll=[];
  for (var i=0;i<num;i++){
    roll.push(Math.floor(Math.random() * (max-min+1))+min);
  }
  return {roll:roll,total:roll.reduce(getSum)};                         
}
20
задан codeforester 10 May 2018 в 04:51
поделиться

5 ответов

Так как Вы говорите, что можно отредактировать сам сценарий, просто поместить a:

ps -ef >/tmp/bash_stack_trace.$$

в нем, где проблема происходит.

Это создаст много файлов в Вашем tmp каталог, которые показывают весь список процессов в то время, когда это произошло.

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

Необходимо будет следить за файлами, так как Вы получите одно для каждого процесса, таким образом, их, вероятно, придется управлять. Так как это - что-то, что должно только быть сделано во время отладки, большую часть времени та строка будет прокомментирована (предшествовавший #), таким образом, файлы не будут созданы.

Для чистки их можно просто сделать:

rm /tmp/bash_stack_trace.*
6
ответ дан 30 November 2019 в 00:05
поделиться

при добавлении pstree-p-u 'whoami'>> вывод в сценарии, вероятно, получит Вас информация, в которой Вы нуждаетесь.

0
ответ дан 30 November 2019 в 00:05
поделиться
~$ help caller
caller: caller [EXPR]
    Returns the context of the current subroutine call.

    Without EXPR, returns "$line $filename".  With EXPR,
    returns "$line $subroutine $filename"; this extra information
    can be used to provide a stack trace.

    The value of EXPR indicates how many call frames to go back before the
    current one; the top frame is frame 0.
7
ответ дан 30 November 2019 в 00:05
поделиться

Вы могли попробовать что-то как

strace -f -e execve script.sh
-1
ответ дан 30 November 2019 в 00:05
поделиться

Простой сценарий, который я написал несколько дней назад ...

# FILE       : sctrace.sh
# LICENSE    : GPL v2.0 (only)
# PURPOSE    : print the recursive callers' list for a script
#              (sort of a process backtrace)
# USAGE      : [in a script] source sctrace.sh
#
# TESTED ON  :
# - Linux, x86 32-bit, Bash 3.2.39(1)-release

# REFERENCES:
# [1]: http://tldp.org/LDP/abs/html/internalvariables.html#PROCCID
# [2]: http://linux.die.net/man/5/proc
# [3]: http://linux.about.com/library/cmd/blcmdl1_tac.htm

#! /bin/bash

TRACE=""
CP=$$ # PID of the script itself [1]

while true # safe because "all starts with init..."
do
        CMDLINE=$(cat /proc/$CP/cmdline)
        PP=$(grep PPid /proc/$CP/status | awk '{ print $2; }') # [2]
        TRACE="$TRACE [$CP]:$CMDLINE\n"
        if [ "$CP" == "1" ]; then # we reach 'init' [PID 1] => backtrace end
                break
        fi
        CP=$PP
done
echo "Backtrace of '$0'"
echo -en "$TRACE" | tac | grep -n ":" # using tac to "print in reverse" [3]

... и простой тест.

test

Надеюсь, вам понравится.

15
ответ дан 30 November 2019 в 00:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: