gdb - отладка с каналом

Как упомянуто в комментарии Persistent13, разница в кодировании является наиболее вероятной причиной. Класс кодирования в .Net имеет несколько статических членов, соответствующих общим кодировкам, но ISO-8859-1 не является одним из них. Остальное можно увидеть с помощью [System.Text.Encoding]::GetEncodings(), а конкретное - с помощью [System.Text.Encoding]::GetEncoding() (есть несколько перегрузок).

Так, например, попробуйте это:

$bytes = [System.Text.Encoding]::GetEncoding('iso-8859-1').GetBytes($string)
[System.Security.Cryptography.HashAlgorithm]::Create("sha1").ComputeHash($bytes)

Поскольку вы не можете изменить часть PowerShell, вы можете сделать это просто для проверки теории в консоли.

Или перейдите прямо к изменению Ruby для использования UTF8.

varj_Encoded = varj.encode(Encoding::UTF-8)
puts Digest::SHA1.hexdigest(varj_Encoded)
38
задан hexacyanide 27 October 2015 в 18:16
поделиться

1 ответ

Сначала вы можете запустить программу и отладить ее с помощью pid. Это решение, конечно, не охватывает все случаи.

Другой подход заключается в использовании возможностей Linux для межпроцессного взаимодействия. Короче говоря, вы перенаправляете вывод ret в специальный файл FIFO («именованный канал») и затем читаете из этого FIFO через отладчик. Вот как это делается. Из bash запустите:

mkfifo foo

Это создаст специальный файл в вашем каталоге, который будет служить именованным каналом . Когда вы пишете текст в этот файл (используя тот же синтаксис echo "Hello" >foo), программа записи будет блокироваться, пока кто-то не прочитает данные из файла (например, cat <foo). В нашем случае процесс, управляемый GDB, будет читать из этого файла.

После того, как вы создали fifo, запустите из bash:

ret > foo &   # ampersand because it may block as nobody is reading from foo
gdb blah

Затем, в приглашении gdb, запустите

run <foo

и получите желаемый эффект. Обратите внимание, что вы не можете прочитать данные из fifo (как и из обычного канала) дважды: когда вы прочитаете все данные, процесс blah завершится, и вы должны повторить команду записи в foo (вы можете сделать это из другого окна оболочки).

Когда вы закончите, удалите fifo с помощью rm foo (или поместите его в каталог, где он будет автоматически удален при перезапуске системы, например /tmp).

45
ответ дан P Shved 27 November 2019 в 03:43
поделиться
Другие вопросы по тегам:

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