Двоичный поиск провальной строки

Загрузчик хранит initrd в местоположение в памяти и говорит ядру адрес памяти изображения initrd. Самые современные системы Linux используют initramfs схему с помощью dracut, который является на самом деле архивом cpio (а не образ диска), который распакован в tmpfs файловую систему, созданную ядром вскоре после выполнения.

1
17.10.2013, 02:27
1 ответ

можно использовать split для разделения файла на несколько частей, и это имеет опцию только разделить в строках:

$ ls
bigfile
$ split -n l/2 bigfile
$ ls
bigfile xaa xab

это действительно только имеет смысл, если файл может быть разделен и организован в строках, который только верен для текстовых файлов.

с этим можно легко создать собственный делить-пополам-инструмент, например, что-то как следующее:

#!/bin/sh

TESTPROG=$1
DATA=$2

usage() {
    echo "usage: $0 <testprog> <datafile>"
    echo "     will bisect <datafile> to the single line where <testprog> exits with '0'"
    exit 1
}

if [ ! -x "${TESTPROG}" ]; then  usage; fi
if [ ! -e "${DATA}" ]    ; then  usage; fi

BISECTDIR=$(mktemp -d)

splitfiles() {
    split -e -n l/2 $1 ${BISECTDIR}/$2bisect_
    echo ${BISECTDIR}/$2bisect_*
}
cleanup() {
    rm -rf "${BISECTDIR}"
    exit 0
}

i=1
while [ $(head -2 "${DATA}" | wc -l) -gt 1 ]; do
  echo "testing: ${DATA} $(head -2 "${DATA}" | wc -l)" 1>&2
  files=$(splitfiles ${DATA} ${i})
  count=$(echo $files | awk '{print NF}')
  if [  ${count} -lt 2 ]; then
      cat $files
      cleanup
  fi
  DATA=""
  for f in $files; do
          if ${TESTPROG} "${f}" 1>/dev/null 2>/dev/null; then
          DATA="${f}"
          break
      fi
  done
  i=$(( i+1 ))
done

cleanup

протест: это поместит все разделенные пополам данные в /tmp (изменитесь, определение BISECTDIR - Вы, не любят это); также это будет только очистка разделенные пополам файлы данных в конце. таким образом, Вам, возможно, понадобилось бы много пространства...

1
27.01.2020, 23:53
  • 1
    То, что я ищу, является более крупным инструментом - подобный 'мерзавцу, делят пополам выполненный', который сделает разделение и тестирование без моего вмешательства. –  Ole Tange 16.10.2013, 16:14
  • 2
    @OleTange я обновил свой ответ для включения такого инструмента, записанного в удар. –  umläute 17.10.2013, 17:27

Теги

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