Можем ли мы получить адрес переменной в программе на C, используя GDB?

Это демонстрация концепции с использованием только alsa, модуля обратной связи alsa и soxдля обнаружения тишины. Модуль loopback предоставляет вам устройство вывода, на которое вы можете воспроизводить звук, а затем записывать с него. Так, например, вы можете настроить mplayerна использование шлейфа для вывода звука, а затем запустить soxдля записи из шлейфа, обнаружения тишины и вывода на исходное аппаратное устройство вывода.

Загрузите модуль с помощью

sudo modprobe snd-aloop

(Он был в моем списке доступных модулей ядра ). aplay -lтеперь будет отображать новую карту с 2 устройствами. Устройство 0 для воспроизведения, устройство 1 для записи. Существует 8 независимых каналов «подустройства», и проще всего использовать номер 0, так как часто его можно опустить. (Я нашел aplayв пакете alsa-utils).

$ aplay -l
...
card 1: Loopback [Loopback], device 0: Loopback PCM [Loopback PCM]
  Subdevices: 8/8
  Subdevice #0: subdevice #0
  Subdevice #1: subdevice #1
...
  Subdevice #7: subdevice #7
card 1: Loopback [Loopback], device 1: Loopback PCM [Loopback PCM]
  Subdevices: 8/8
  Subdevice #0: subdevice #0
  Subdevice #1: subdevice #1
...
  Subdevice #7: subdevice #7

Теперь вы можете использовать другую утилиту из пакета для создания непрерывного тонального сигнала на кольцевое устройство 0 (подустройство 0):

speaker-test -t sine -D hw:Loopback

или, например, скажите mplayer, чтобы использовать устройство с опцией -ao alsa:device=hw=Loopback

.

Вы ничего не услышите, пока не запустите soxдля чтения другой стороны устройства и записи на реальное оборудование, предполагая, что это карта 0:

sox -q  -t alsa hw:Loopback,1  -t alsa hw:0  silence 0 1 10.0 2%

(Я видел довольно много предупреждений sox WARN alsa :под -run). Если вы остановите проверку динамиков, после 10 секунд тишины команда soxпрекратится. Примечание,если вы отключите звук mplayer, вы получите тишину, но это, кажется, не зависит от уровня данных (, который вы можете визуализировать, если удалите -qизsox). Вам нужно приостановить или уменьшить уровень звука mplayer, чтобы обнаружить тишину. soxтакже может привести к задержке звука на одну-две секунды. Вы должны иметь возможность настроить alsa так, чтобы устройство Loopback использовалось по умолчанию вместо вашей карты 0.

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

Возможно более простое решение с использованием pulseaudio для включения мониторинга с использованием pactl load-module module-combine-sink, которое я, вероятно, рассмотрю.

1
20.09.2019, 16:23
1 ответ

Да, если ваша переменная не оптимизирована.

Например, используя lsс символами отладки:

gdb ls
>>> break main
>>> run
>>> print argv
$1 = (char **) 0x7fffffffdd78

В данном случае argvявляется указателем. Если вам нужен адрес переменной-указателя, отличной от -, или адрес указателя, используйте &, как в C; gdbдаст вам адрес, как указано выше, или сообщит вам, если переменная не сохранена в памяти:

>>> printf &argc
Address requested for identifier "argc" which is in register $rdi

В x86 содержимое SPподскажет вам, где находится стек:

>>> i r sp
sp             0x7fffffffdc98      0x7fffffffdc98
3
27.01.2020, 23:30

Теги

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