Есть ли способ узнать, какая функция выводит на терминал печать? - PullRequest
1 голос
/ 06 августа 2020

Я отлаживал действительно сложную функцию (python функция, которая вызывает некоторые модули C ++ из Boost / Python), и есть print или cout или другая подобная функция, которую я забыл удалить (может ' t, кажется, нашел его с помощью grep), и теперь программа просто продолжает печатать кучу нулей. Есть ли способ узнать, какая функция печатала на терминале, или единственным способом удалить оператор печати один за другим? Я использую Fedora linux, если это поможет

Спасибо

Ответы [ 3 ]

1 голос
/ 06 августа 2020

Обычно я дополняю свои сложные проекты различными формами трассировки вывода. Конкретный элемент, который применяется здесь, - это trace_prefix. Например:

TRACE = True
# TRACE = False    # Uncomment this line for production runs.

def func(param):
    trace_prefix = "TRACE func" if TRACE else ""
    if TRACE:
        print("ENTER", func, "param =", param)

    ...
    print(trace_prefix, func_data)
    ...

Это дает результат, который я могу идентифицировать с помощью «grep TRACE», а также выбирая поток из данной процедуры или пакета. Это достаточно легко параметризовать (возьмите имя функции); Я сделал это с помощью декоратора.

0 голосов
/ 06 августа 2020

1. Если ваша программа работает в многопроцессорном режиме, вам необходимо знать, какой процесс записывает "0" в терминал.

#!/usr/bin/env python3
'''
a simple program to stimulate writing terminal in multiple processes.
'''
prog name: ttywriter.py
import time
import sys
import multiprocessing
def print_stderr(s):
    sys.stderr.write(f'{s}\n')

while True:
    print("I'm writing to my terminal")
    p = multiprocessing.Process(target=print_stderr,args=("I am a CPP program, writing to termianl",))
    p.start()
    time.sleep(1)

Псевдотерминал обычно открывается как файловый дескриптор 1 и 2. вы можете strace их.

# tty
/dev/pts/0

# ps -ef
UID          PID    PPID  C STIME TTY          TIME CMD
root        2640    2427  0 07:07 pts/0    00:00:00 python3 ./ttywriter.py

# lsof -p `pgrep -f ttywriter` | grep pts
python3 2640 root    0u   CHR  136,0      0t0     3 /dev/pts/0
python3 2640 root    1u   CHR  136,0      0t0     3 /dev/pts/0
python3 2640 root    2u   CHR  136,0      0t0     3 /dev/pts/0

# strace -s 65536 -e trace=write -e write=1,2 -fp `pgrep -f ttywriter`
strace: Process 2640 attached
write(1, "I'm writing to my terminal\n", 27) = 27
 | 00000  49 27 6d 20 77 72 69 74  69 6e 67 20 74 6f 20 6d  I'm writing to m |
 | 00010  79 20 74 65 72 6d 69 6e  61 6c 0a                 y terminal.      |
strace: Process 2695 attached
[pid  2695] write(2, "I am a CPP program, writing to termianl\n", 40) = 40
 | 00000  49 20 61 6d 20 61 20 43  50 50 20 70 72 6f 67 72  I am a CPP progr |
 | 00010  61 6d 2c 20 77 72 69 74  69 6e 67 20 74 6f 20 74  am, writing to t |
 | 00020  65 72 6d 69 61 6e 6c 0a                           ermianl.         |
[pid  2695] +++ exited with 0 +++
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=2695, si_uid=0, si_status=0, si_utime=0, si_stime=0} ---

2. если это Python, вы можете захватить sys.out или напечатать , чтобы распечатать стек вызовов.

3. если это C / C ++, вы можете установить условную точку останова для указанной c строки, записываемой в терминал .

0 голосов
/ 06 августа 2020

Если печать происходит из Python, настройка регистратора с помощью сложных средств форматирования может помочь вам точно просмотреть модуль, номер строки, веселье c имя, временную метку и т. Д. c.

Вот пример форматтер, который я использую в своем проекте.

%(asctime)-s.%(msecs)03d %(levelname)-6.6s %(filename)-18.18s line:%(lineno)-4.4d %(funcName)-18s %(message)s

И результаты:

2020-08-05 00:28:36.232 DEBUG  connectionpool.py  line:0959 _new_conn          The fancy thing that gets printed.
2020-08-05 00:28:38.177 DEBUG  connectionpool.py  line:0437 _make_request      This is your message but you have more info before this.
2020-08-05 00:28:38.180 DEBUG  item.py            line:0159 start_indexing     Loggers with proper formatters can help you see
2020-08-05 00:28:38.180 DEBUG  indexer.py         line:0036 start              Extensive information

Код:

import logging
import sys

LOGGER = logging.getLogger(__name__)
HANDLER = logging.StreamHandler(sys.stdout)
HANDLER.setFormatter(logging.Formatter("%(asctime)-s.%(msecs)03d %(levelname)-6.6s %(filename)-18.18s line:%(lineno)-4.4d %(funcName)-18s %(message)s"))
LOGGER.addHandler(HANDLER)

LOGGER.error("Here we go!")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...