I'm using pygdbmi to drive an embedded system, and so far everything works great. I can load an embedded application, I can set breakpoints, I can run, I can stop. and I can use -data-list-register-values x
for one of my company's products, which runs an Arm Cortex-M3 cpu.
I recently started to use the same code for another product. This second product uses an Arm Cortex-M33 CPU, and pretty much all the commands work file with it, with the exception of -data-list-register-values x
.
My setup is this: both CPUs are using a JLink adapter, so I'm interfacing them through JLinkGDBServerCL.exe
.
My test code is:
import unittest
import subprocess
import time
from pprint import pprint
from pygdbmi.gdbcontroller import GdbController
from gdbdrivermi import kill_synopsys_tools
import logging
logging.basicConfig(filename='myapp.log', level=logging.DEBUG)
class TestPyGDBMI(unittest.TestCase):
def test_connect(self):
command = [
'C:\\Program Files (x86)\\SEGGER\\JLink_V694d\\JLinkGDBServerCL.exe',
'-select', 'USB', '-if', 'SWD', '-device', 'RSL15', '-endian',
'little', '-speed', '1000', '-port', '2331', '-vd', '-ir',
'-localhostonly', '1', '-noreset', '-singlerun', '-strict',
'-timeout 0', '-nogui']
# Use pipes to the standard streams
gdbServer = subprocess.Popen(command,
shell=False,
stdout=subprocess.PIPE,
stdin=subprocess.PIPE,
stderr=subprocess.PIPE,
bufsize=0,
)
gdb_command = ['C:\\Program Files (x86)\\ON Semiconductor\\IDE\\arm_tools\\bin\\arm-none-eabi-gdb.exe',
'--nx', '--quiet', '--interpreter=mi3']
# Start gdb process
gdbmi = GdbController(command=gdb_command,
time_to_check_for_additional_output_sec=3)
response = gdbmi.write('-gdb-set trace-commands on', timeout_sec=5)
pprint(response)
response = gdbmi.write('-gdb-set logging on', timeout_sec=5)
pprint(response)
response = gdbmi.write('-target-select remote localhost:2331', timeout_sec=5)
pprint(response)
response = gdbmi.write('-interpreter-exec console "monitor reset "', timeout_sec=5)
pprint(response)
response = gdbmi.write('-interpreter-exec console "monitor halt"', timeout_sec=5)
pprint(response)
response = gdbmi.write('-file-exec-and-symbols blinky.elf', timeout_sec=5)
pprint(response)
response = gdbmi.write('-target-download', timeout_sec=5)
pprint(response)
response = gdbmi.write('-break-insert main', timeout_sec=5)
pprint(response)
response = gdbmi.write('continue&', timeout_sec=5)
pprint(response)
response = gdbmi.write('-data-list-register-names', timeout_sec=5)
pprint(response)
response = gdbmi.write('-data-list-register-values x', timeout_sec=10)
pprint(response)
assert True
if __name__ == '__main__':
unittest.main()
Everything works 100 % fine until I send -data-list-register-values x
, then GdbController
gets stuck and I can't receive anything from GDB.
If I start JLinkGDBServerCL.exe
and arm-none-eabi-gdb.exe
and use the exact same sequence of commands, I get a nice reply:
Starting GDB server:
"C:\Program Files (x86)\SEGGER\JLink_V694d\JLinkGDBServerCL.exe" -select USB -if SWD -device RSL15 -endian little -speed 1000 -port 2331 -vd -ir -localhostonly 1 -noreset -singlerun -strict -timeout 0 -nogui
Running GDB Arm:
"C:\Program Files (x86)\ON Semiconductor\IDE\arm_tools\bin\arm-none-eabi-gdb.exe" --nx --quiet --interpreter=mi3
C:\Program Files (x86)\ON Semiconductor\IDE\arm_tools\bin\arm-none-eabi-gdb.exe: warning: Couldn't determine a path for the index cache directory.
=thread-group-added,id="i1"
(gdb)
-gdb-set trace-commands on
^done
(gdb)
-gdb-set logging on
~"+set logging on\n"
^done
(gdb)
-target-select remote localhost:2331
~"+target remote localhost:2331\n"
=thread-group-started,id="i1",pid="42000"
&"warning: No executable has been specified and target does not support\ndetermining executable automatically. Try using the \"file\" command."
&"\n"
=thread-created,id="1",group-id="i1"
~"0x00000000 in ?? ()\n"
*stopped,frame={addr="0x00000000",func="??",args=[],arch="arm"},thread-id="1",stopped-threads="all"
^connected
(gdb)
-interpreter-exec console "monitor reset "
~"+monitor reset \n"
@"Resetting target\r\n"
^done
(gdb)
-interpreter-exec console "monitor halt"
~"+monitor halt\n"
^done
(gdb)
-file-exec-and-symbols blinky.elf
~"+file blinky.elf\n"
^done
(gdb)
-target-download
~"+load \n"
+download,{section=".text",section-size="6840",total-size="59929"}
+download,{section=".text",section-sent="6840",section-size="6840",total-sent="6840",total-size="59929"}
+download,{section=".ARM.exidx.reset",section-size="8",total-size="59929"}
+download,{section=".data",section-size="5240",total-size="59929"}
^done,address="0x100124",load-size="12088",transfer-rate="1179312",write-rate="4029"
(gdb)
-break-insert main
^done,bkpt={number="1",type="breakpoint",disp="keep",enabled="y",addr="0x00100540",func="main",file="C:/git/blinky/app.c",fullname="C:\\git\\blinky\\app.c",line="144",thread-groups=["i1"],times="0",original-location="main"}
(gdb)
continue&
&"continue&\n"
~"+continue&\n"
~"Continuing.\n"
^running
*running,thread-id="all"
(gdb)
~"\nProgram"
~" received signal SIGTRAP, Trace/breakpoint trap.\n"
~"0xeffffffe in ?? ()\n"
*stopped,reason="signal-received",signal-name="SIGTRAP",signal-meaning="Trace/breakpoint trap",frame={addr="0xeffffffe",func="??",args=[],arch="armv8-m.main"},thread-id="1",stopped-threads="all"
-data-list-register-names
^done,register-names=["r0","r1","r2","r3","r4","r5","r6","r7","r8","r9","r10","r11","r12","sp","lr","pc","","","","","","","","","","xpsr","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","msp","psp","primask","basepri","faultmask","control","fpscr","s0","s1","s2","s3","s4","s5","s6","s7","s8","s9","s10","s11","s12","s13","s14","s15","s16","s17","s18","s19","s20","s21","s22","s23","s24","s25","s26","s27","s28","s29","s30","s31","d0","d1","d2","d3","d4","d5","d6","d7","d8","d9","d10","d11","d12","d13","d14","d15","msp_s","msplim_s","psp_s","psplim_s","msp_ns","msplim_ns","psp_ns","psplim_ns","control_s","faultmask_s","basepri_s","primask_s","control_ns","faultmask_ns","basepri_ns","primask_ns"]
(gdb)
-data-list-register-values x
^done,register-values=[{number="0",value="0x0"},{number="1",value="0x0"},{number="2",value="0x0"},{number="3",value="0x80730"},{number="4",value="0x40000100"},{number="5",value="0x101"},{number="6",value="0x3ff01"},{number="7",value="0x0"},{number="8",value="0xffffffff"},{number="9",value="0x40001430"},{number="10",value="0xffffffff"},{number="11",value="0xffffffff"},{number="12",value="0xffffffff"},{number="13",value="0x20001e58"},{number="14",value="0x20001e69"},{number="15",value="0xeffffffe"},{number="25",value="0x41000003"},{number="91",value="0x20001e58"},{number="92",value="0x0"},{number="93",value="0x1"},{number="94",value="0x0"},{number="95",value="0x0"},{number="96",value="0x0"},{number="97",value="0x0"},{number="98",value="0x0"},{number="99",value="0x0"},{number="100",value="0x0"},{number="101",value="0x0"},{number="102",value="0x0"},{number="103",value="0x0"},{number="104",value="0x0"},{number="105",value="0x0"},{number="106",value="0x0"},{number="107",value="0x0"},{number="108",value="0x0"},{number="109",value="0x0"},{number="110",value="0x0"},{number="111",value="0x0"},{number="112",value="0x0"},{number="113",value="0x0"},{number="114",value="0x0"},{number="115",value="0x0"},{number="116",value="0x0"},{number="117",value="0x0"},{number="118",value="0x0"},{number="119",value="0x0"},{number="120",value="0x0"},{number="121",value="0x0"},{number="122",value="0x0"},{number="123",value="0x0"},{number="124",value="0x0"},{number="125",value="0x0"},{number="126",value="0x0"},{number="127",value="0x0"},{number="128",value="0x0"},{number="129",value="0x0"},{number="130",value="0x0"},{number="131",value="0x0"},{number="132",value="0x0"},{number="133",value="0x0"},{number="134",value="0x0"},{number="135",value="0x0"},{number="136",value="0x0"},{number="137",value="0x0"},{number="138",value="0x0"},{number="139",value="0x0"},{number="140",value="0x0"},{number="141",value="0x0"},{number="142",value="0x0"},{number="143",value="0x0"},{number="144",value="0x0"},{number="145",value="0x0"},{number="146",value="0x20001e58"},{number="147",value="0x0"},{number="148",value="0x0"},{number="149",value="0x0"},{number="150",value="0x0"},{number="151",value="0x0"},{number="152",value="0xfffffffc"},{number="153",value="0x0"},{number="154",value="0x0"},{number="155",value="0x0"},{number="156",value="0x0"},{number="157",value="0x1"},{number="158",value="0x0"},{number="159",value="0x0"},{number="160",value="0x0"},{number="161",value="0x0"}]
(gdb)
So, this discards JLinkGDBServerCL.exe
and arm-none-eabi-gdb.exe
. I've attached the log as gdb_works.txt
Next, I added some log statements in IoManager._get_responses_windows
:
def _get_responses_windows(self, timeout_sec):
"""Get responses on windows. Assume no support for select and use a while loop."""
timeout_time_sec = time.time() + timeout_sec
responses = []
logger.debug("_get_responses_windows 109")
while True:
responses_list = []
#logger.debug("_get_responses_windows 113")
try:
self.stdout.flush()
raw_output = self.stdout.readline().replace(b"\r", b"\n")
logger.debug(f"raw_output 117 {raw_output}")
responses_list = self._get_responses_list(raw_output, "stdout")
except IOError as e:
pass
try:
self.stderr.flush()
raw_output = self.stderr.readline().replace(b"\r", b"\n")
logger.debug(f"raw_output 126 {raw_output}")
responses_list += self._get_responses_list(raw_output, "stderr")
except IOError as e:
pass
Looking at the log file, for the commands that produce a reply, I can see:
DEBUG:pygdbmi.IoManager:writing: -data-list-register-names
DEBUG:pygdbmi.IoManager:_get_responses_windows 109
DEBUG:pygdbmi.IoManager:raw_output 117 b'^done,register-names=["r0","r1","r2","r3","r4","r5","r6","r7","r8","r9","r10","r11","r12","sp","lr","pc","","","","","","","","","","xpsr","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","msp","psp","primask","basepri","faultmask","control","fpscr","s0","s1","s2","s3","s4","s5","s6","s7","s8","s9","s10","s11","s12","s13","s14","s15","s16","s17","s18","s19","s20","s21","s22","s23","s24","s25","s26","s27","s28","s29","s30","s31","d0","d1","d2","d3","d4","d5","d6","d7","d8","d9","d10","d11","d12","d13","d14","d15","msp_s","msplim_s","psp_s","psplim_s","msp_ns","msplim_ns","psp_ns","psplim_ns","control_s","faultmask_s","basepri_s","primask_s","control_ns","faultmask_ns","basepri_ns","primask_ns"]\n\n'
DEBUG:pygdbmi.IoManager:_get_responses_list (b'^done,register-names=["r0","r1","r2","r3","r4","r5","r6","r7","r8","r9","r10'
b'","r11","r12","sp","lr","pc","","","","","","","","","","xpsr","","","","","'
b'","","","","","","","","","","","","","","","","","","","","","","","","",""'
b',"","","","","","","","","","","","","","","","","","","","","","","","","",'
b'"","","","","","","","","","","msp","psp","primask","basepri","faultmask","c'
b'ontrol","fpscr","s0","s1","s2","s3","s4","s5","s6","s7","s8","s9","s10","s11'
b'","s12","s13","s14","s15","s16","s17","s18","s19","s20","s21","s22","s23","s'
b'24","s25","s26","s27","s28","s29","s30","s31","d0","d1","d2","d3","d4","d5",'
b'"d6","d7","d8","d9","d10","d11","d12","d13","d14","d15","msp_s","msplim_s","'
b'psp_s","psplim_s","msp_ns","msplim_ns","psp_ns","psplim_ns","control_s","fau'
b'ltmask_s","basepri_s","primask_s","control_ns","faultmask_ns","basepri_ns","'
b'primask_ns"]\n\n')
DEBUG:pygdbmi.IoManager:{'message': 'done',
'payload': {'register-names': ['r0',
'r1',
'r2',
'r3',
'r4',
'r5',
'r6',
'r7',
'r8',
'r9',
'r10',
'r11',
'r12',
'sp',
'lr',
'pc',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'xpsr',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'msp',
'psp',
'primask',
'basepri',
'faultmask',
'control',
'fpscr',
's0',
's1',
's2',
's3',
's4',
's5',
's6',
's7',
's8',
's9',
's10',
's11',
's12',
's13',
's14',
's15',
's16',
's17',
's18',
's19',
's20',
's21',
's22',
's23',
's24',
's25',
's26',
's27',
's28',
's29',
's30',
's31',
'd0',
'd1',
'd2',
'd3',
'd4',
'd5',
'd6',
'd7',
'd8',
'd9',
'd10',
'd11',
'd12',
'd13',
'd14',
'd15',
'msp_s',
'msplim_s',
'psp_s',
'psplim_s',
'msp_ns',
'msplim_ns',
'psp_ns',
'psplim_ns',
'control_s',
'faultmask_s',
'basepri_s',
'primask_s',
'control_ns',
'faultmask_ns',
'basepri_ns',
'primask_ns']},
'stream': 'stdout',
'token': None,
'type': 'result'}
OK, so far so good, but when I send -data-list-register-values x
:
DEBUG:pygdbmi.IoManager:writing: -data-list-register-values x
DEBUG:pygdbmi.IoManager:_get_responses_windows 109
And that's it, I don't get a DEBUG:pygdbmi.IoManager:raw_output
debug message. This tells me that _get_responses_windows
keeps looping forever catching IOError
exceptions until it times out.
If I look at the gdb.txt file, GDB seems to be replying with the register values:
^done,register-values=[{number="0",value="0x0"},{number="1",value="0x0"},{number="2",value="0x0"},{number="3",value="0x80730"},{number="4",value="0x40000100"},{number="5",value="0x101"},{number="6",value="0x3ff01"},{number="7",value="0x0"},{number="8",value="0xffffffff"},{number="9",value="0x40001430"},{number="10",value="0xffffffff"},{number="11",value="0xffffffff"},{number="12",value="0xffffffff"},{number="13",value="0x20001e58"},{number="14",value="0x20001e69"},{number="15",value="0xeffffffe"},{number="25",value="0x41000003"},{number="91",value="0x20001e58"},{number="92",value="0x0"},{number="93",value="0x1"},{number="94",value="0x0"},{number="95",value="0x0"},{number="96",value="0x0"},{number="97",value="0x0"},{number="98",value="0x0"},{number="99",value="0x0"},{number="100",value="0x0"},{number="101",value="0x0"},{number="102",value="0x0"},{number="103",value="0x0"},{number="104",value="0x0"},{number="105",value="0x0"},{number="106",value="0x0"},{number="107",value="0x0"},{number="108",value="0x0"},{number="109",value="0x0"},{number="110",value="0x0"},{number="111",value="0x0"},{number="112",value="0x0"},{number="113",value="0x0"},{number="114",value="0x0"},{number="115",value="0x0"},{number="116",value="0x0"},{number="117",value="0x0"},{number="118",value="0x0"},{number="119",value="0x0"},{number="120",value="0x0"},{number="121",value="0x0"},{number="122",value="0x0"},{number="123",value="0x0"},{number="124",value="0x0"},{number="125",value="0x0"},{number="126",value="0x0"},{number="127",value="0x0"},{number="128",value="0x0"},{number="129",value="0x0"},{number="130",value="0x0"},{number="131",value="0x0"},{number="132",value="0x0"},{number="133",value="0x0"},{number="134",value="0x0"},{number="135",value="0x0"},{number="136",value="0x0"},{number="137",value="0x0"},{number="138",value="0x0"},{number="139",value="0x0"},{number="140",value="0x0"},{number="141",value="0x0"},{number="142",value="0x0"},{number="143",value="0x0"},{number="144",value="0x0"},{number="145",value="0x0"},{number="146",value="0x20001e58"},{number="147",value="0x0"},{number="148",value="0x0"},{number="149",value="0x0"},{number="150",value="0x0"},{number="151",value="0x0"},{number="152",value="0xfffffffc"},{number="153",value="0x0"},{number="154",value="0x0"},{number="155",value="0x0"},{number="156",value="0x0"},{number="157",value="0x1"},{number="158",value="0x0"},{number="159",value="0x0"},{number="160",value="0x0"},{number="161",value="0x0"}]
(gdb)
~"Exception condition detected on fd 0\n"
~"error detected on stdin\n"
The last two lines are specially worrisome:
~"Exception condition detected on fd 0\n"
~"error detected on stdin\n"
Any ideas on how to test if the stdout PIPE is stuck?
I've attached pygdbmi log file (myapp.log
), and GDB's log (gdb.txt
).
myapp.log
Many thanks!!!
Please complete the following information:
- OS: Windows 10 64 bits
- Python: Python 3.8.5
- pygdbmi version (
pip freeze
output):
pip freeze
-ffi @ file:///C:/ci/cffi_1600695147257/work
alabaster==0.7.12
anaconda-client==1.7.2
anaconda-navigator==1.10.0
anaconda-project==0.8.3
# Editable install with no version control (antigravity==0.0.1)
-e c:\git\swt_root\new_project
appdirs==1.4.4
argh==0.26.2
argon2-cffi @ file:///C:/ci/argon2-cffi_1596828587441/work
asn1crypto @ file:///tmp/build/80754af9/asn1crypto_1596577642040/work
astroid @ file:///C:/ci/astroid_1592495994461/work
astropy==4.0.2
astunparse==1.6.3
async-generator==1.10
atomicwrites==1.4.0
attrs @ file:///tmp/build/80754af9/attrs_1604765588209/work
autopep8 @ file:///tmp/build/80754af9/autopep8_1596578164842/work
Babel @ file:///tmp/build/80754af9/babel_1605108370292/work
backcall==0.2.0
backports.functools-lru-cache==1.6.1
backports.shutil-get-terminal-size==1.0.0
backports.tempfile==1.0
backports.weakref==1.0.post1
bcrypt @ file:///C:/ci/bcrypt_1597918155848/work
beautifulsoup4 @ file:///tmp/build/80754af9/beautifulsoup4_1601924105527/work
behave==1.2.6
-e git+ssh://[email protected]/asgswm/test-infrastructure.git@7539ba6f22e32ab2cebf31535f644b566028a5cd#egg=behave_steps_common&subdirectory=behave_steps_common
bitarray @ file:///C:/ci/bitarray_1605047058594/work
bkcharts==0.2
bleach @ file:///tmp/build/80754af9/bleach_1600439572647/work
bokeh @ file:///C:/ci/bokeh_1603279774334/work
boto==2.49.0
Bottleneck==1.3.2
brotlipy==0.7.0
-e git+ssh://[email protected]/asgswm/test-infrastructure.git@7539ba6f22e32ab2cebf31535f644b566028a5cd#egg=buildtoolchain&subdirectory=buildtoolchain
certifi==2020.6.20
cffi==1.14.5
chardet==3.0.4
chevron==0.14.0
click==7.1.2
cloudpickle @ file:///tmp/build/80754af9/cloudpickle_1598884132938/work
clyent==1.2.2
colorama @ file:///tmp/build/80754af9/colorama_1603211150991/work
comtypes==1.1.7
conda==4.9.2
conda-build==3.20.5
conda-package-handling @ file:///C:/ci/conda-package-handling_1603004884858/work
conda-verify==3.4.2
contextlib2==0.6.0.post1
cryptography @ file:///C:/ci/cryptography_1598892121735/work
-e git+ssh://[email protected]/asgswm/test-infrastructure.git@7539ba6f22e32ab2cebf31535f644b566028a5cd#egg=ctkdriver&subdirectory=ctkdriver
cycler==0.10.0
Cython @ file:///C:/ci/cython_1594830140812/work
cytoolz==0.11.0
dask @ file:///tmp/build/80754af9/dask-core_1602083700509/work
decorator==4.4.2
defusedxml==0.6.0
diff-match-patch @ file:///tmp/build/80754af9/diff-match-patch_1594828741838/work
distlib==0.3.1
distributed @ file:///C:/ci/distributed_1605066638460/work
docutils==0.16
-e git+ssh://[email protected]/asgswm/doxygenflare.git@56a4d9dc68100680f2a23c403aad54cc9472aad4#egg=DoxygenFlare
entrypoints==0.3
et-xmlfile==1.0.1
fastcache==1.1.0
filelock==3.0.12
flake8 @ file:///tmp/build/80754af9/flake8_1601911421857/work
Flask==1.1.2
fs==2.4.12
fsspec @ file:///tmp/build/80754af9/fsspec_1602684995936/work
future==0.18.2
-e git+ssh://[email protected]/asgswm/test-infrastructure.git@7539ba6f22e32ab2cebf31535f644b566028a5cd#egg=gdbdrivermi&subdirectory=gdbdrivermi
gevent @ file:///C:/ci/gevent_1602672263874/work
glob2==0.7
greenlet @ file:///C:/ci/greenlet_1600869667188/work
h5py==2.10.0
HeapDict==1.0.1
html2text==2020.1.16
html5lib @ file:///tmp/build/80754af9/html5lib_1593446221756/work
idna @ file:///tmp/build/80754af9/idna_1593446292537/work
imageio @ file:///tmp/build/80754af9/imageio_1594161405741/work
imagesize==1.2.0
importlib-metadata @ file:///tmp/build/80754af9/importlib-metadata_1602276842396/work
iniconfig @ file:///tmp/build/80754af9/iniconfig_1602780191262/work
intervaltree @ file:///tmp/build/80754af9/intervaltree_1598376443606/work
ipykernel @ file:///C:/ci/ipykernel_1596208574668/work/dist/ipykernel-5.3.4-py3-none-any.whl
ipython @ file:///C:/ci/ipython_1604083205321/work
ipython-genutils==0.2.0
ipywidgets @ file:///tmp/build/80754af9/ipywidgets_1601490159889/work
isort @ file:///tmp/build/80754af9/isort_1602603989581/work
itsdangerous==1.1.0
jdcal==1.4.1
jedi @ file:///C:/ci/jedi_1592831614595/work
Jinja2==2.11.2
joblib @ file:///tmp/build/80754af9/joblib_1601912903842/work
json5==0.9.5
jsonschema @ file:///tmp/build/80754af9/jsonschema_1602607155483/work
jupyter==1.0.0
jupyter-client @ file:///tmp/build/80754af9/jupyter_client_1601311786391/work
jupyter-console @ file:///tmp/build/80754af9/jupyter_console_1598884538475/work
jupyter-core==4.6.3
jupyterlab==2.2.6
jupyterlab-pygments @ file:///tmp/build/80754af9/jupyterlab_pygments_1601490720602/work
jupyterlab-server @ file:///tmp/build/80754af9/jupyterlab_server_1594164409481/work
keyring @ file:///C:/ci/keyring_1598866735485/work
kiwisolver==1.3.1
lazy-object-proxy==1.4.3
libarchive-c==2.9
llvmlite==0.34.0
locket==0.2.0
lxml==4.6.2
markdown2==2.3.10
MarkupSafe==1.1.1
matplotlib==3.3.4
mccabe==0.6.1
menuinst==1.4.16
mistune==0.8.4
mkl-fft==1.2.0
mkl-random==1.1.1
mkl-service==2.3.0
mock==4.0.2
more-itertools @ file:///tmp/build/80754af9/more-itertools_1605111547926/work
mpmath==1.1.0
msgpack==1.0.0
multipledispatch==0.6.0
navigator-updater==0.2.1
nbclient @ file:///tmp/build/80754af9/nbclient_1602783176460/work
nbconvert @ file:///C:/ci/nbconvert_1602277416184/work
nbformat @ file:///tmp/build/80754af9/nbformat_1602783287752/work
nest-asyncio @ file:///tmp/build/80754af9/nest-asyncio_1605115881283/work
networkx @ file:///tmp/build/80754af9/networkx_1598376031484/work
nltk @ file:///tmp/build/80754af9/nltk_1592496090529/work
nose==1.3.7
notebook @ file:///C:/ci/notebook_1602668179504/work
numba==0.51.2
numexpr==2.7.1
numpy==1.20.1
numpydoc @ file:///tmp/build/80754af9/numpydoc_1605117425582/work
olefile==0.46
-e git+ssh://[email protected]/asgswm/test-infrastructure.git@7539ba6f22e32ab2cebf31535f644b566028a5cd#egg=onsemiaudio&subdirectory=onsemiaudio
openpyxl @ file:///tmp/build/80754af9/openpyxl_1598113097404/work
packaging==20.4
pandas @ file:///C:/ci/pandas_1602070092559/work
pandocfilters @ file:///C:/ci/pandocfilters_1605102367649/work
paramiko @ file:///tmp/build/80754af9/paramiko_1598886428689/work
paramiko-expect==0.2.8
parse==1.19.0
parse-type==0.5.2
parso==0.7.0
partd==1.1.0
path @ file:///C:/ci/path_1598376662686/work
pathlib2==2.3.5
pathtools==0.1.2
patsy==0.5.1
pdoc==1.1.0
pep8==1.7.1
pexpect==4.8.0
pickleshare==0.7.5
Pillow==8.1.0
pkginfo==1.6.1
pluggy==0.13.1
ply==3.11
prometheus-client==0.8.0
prompt-toolkit @ file:///tmp/build/80754af9/prompt-toolkit_1602688806899/work
psutil==5.8.0
ptyprocess==0.7.0
py @ file:///tmp/build/80754af9/py_1593446248552/work
pycodestyle==2.6.0
pycosat==0.6.3
pycparser==2.20
pycurl==7.43.0.6
pydash==4.9.2
pydocstyle @ file:///tmp/build/80754af9/pydocstyle_1598885001695/work
-e git+https://github.com/nathanhi/pyfatfs.git@6b9fd267852eb06a4b09b8e7995ad1e778e766a4#egg=pyfatfs
pyflakes==2.2.0
-e git+https://github.com/cs01/pygdbmi.git@23358b9bf6b4957eaac70b579b6858fa4395538a#egg=pygdbmi
Pygments @ file:///tmp/build/80754af9/pygments_1604103097372/work
PyHamcrest==2.0.2
pylink-square==0.8.2
pylint @ file:///C:/ci/pylint_1598624093998/work
PyNaCl @ file:///C:/ci/pynacl_1595009196976/work
pyodbc===4.0.0-unsupported
pyOpenSSL @ file:///tmp/build/80754af9/pyopenssl_1594392929924/work
pyparsing==2.4.7
pyreadline==2.1
pyrsistent @ file:///C:/ci/pyrsistent_1600141795660/work
PySocks==1.7.1
pystache==0.5.4
pytest==0.0.0
python-dateutil==2.8.1
python-jsonrpc-server @ file:///tmp/build/80754af9/python-jsonrpc-server_1600278539111/work
python-language-server @ file:///tmp/build/80754af9/python-language-server_1600454544709/work
pytz==2020.1
PyWavelets==1.1.1
pywin32==227
pywin32-ctypes==0.2.0
pywinpty==0.5.7
PyYAML==5.3.1
pyzmq==19.0.2
QDarkStyle==2.8.1
QtAwesome @ file:///tmp/build/80754af9/qtawesome_1602272867890/work
qtconsole @ file:///tmp/build/80754af9/qtconsole_1600870028330/work
QtPy==1.9.0
regex @ file:///C:/ci/regex_1602770258877/work
requests @ file:///tmp/build/80754af9/requests_1592841827918/work
rope @ file:///tmp/build/80754af9/rope_1602264064449/work
Rtree==0.9.4
ruamel-yaml==0.15.87
scikit-image==0.16.2
scikit-learn @ file:///C:/ci/scikit-learn_1592863447244/work
scipy==1.6.0
seaborn @ file:///tmp/build/80754af9/seaborn_1600553570093/work
Send2Trash==1.5.0
simplegeneric==0.8.1
singledispatch @ file:///tmp/build/80754af9/singledispatch_1602523705405/work
sip==4.19.13
six==1.15.0
snowballstemmer==2.0.0
sortedcollections==1.2.1
sortedcontainers==2.2.2
sounddevice==0.4.1
soupsieve==2.0.1
Sphinx @ file:///tmp/build/80754af9/sphinx_1597428793432/work
sphinx-markdown-builder==0.5.4
sphinxcontrib-applehelp==1.0.2
sphinxcontrib-devhelp==1.0.2
sphinxcontrib-htmlhelp==1.0.3
sphinxcontrib-jsmath==1.0.1
sphinxcontrib-qthelp==1.0.3
sphinxcontrib-serializinghtml==1.1.4
sphinxcontrib-websupport @ file:///tmp/build/80754af9/sphinxcontrib-websupport_1597081412696/work
spyder @ file:///C:/ci/spyder_1599052052164/work
spyder-kernels @ file:///C:/ci/spyder-kernels_1599052729967/work
SQLAlchemy @ file:///C:/ci/sqlalchemy_1603819281407/work
statsmodels==0.12.0
sympy @ file:///C:/ci/sympy_1605119639065/work
tables==3.6.1
tblib @ file:///tmp/build/80754af9/tblib_1597928476713/work
terminado==0.9.1
testpath==0.4.4
threadpoolctl @ file:///tmp/tmp9twdgx9k/threadpoolctl-2.1.0-py3-none-any.whl
toml @ file:///tmp/build/80754af9/toml_1592853716807/work
toolz @ file:///tmp/build/80754af9/toolz_1601054250827/work
tornado==6.0.4
tox==3.21.4
tqdm @ file:///tmp/build/80754af9/tqdm_1602185206534/work
traitlets @ file:///tmp/build/80754af9/traitlets_1602787416690/work
typing-extensions @ file:///tmp/build/80754af9/typing_extensions_1598376058250/work
ujson @ file:///C:/ci/ujson_1602507951182/work
unicodecsv==0.14.1
unify==0.5
untokenize==0.1.1
urllib3 @ file:///tmp/build/80754af9/urllib3_1603305693037/work
virtualenv==20.4.2
watchdog @ file:///C:/ci/watchdog_1593447396356/work
wcwidth @ file:///tmp/build/80754af9/wcwidth_1593447189090/work
webencodings==0.5.1
Werkzeug==1.0.1
wexpect==4.0.0
widgetsnbextension==3.5.1
win-inet-pton==1.1.0
win-unicode-console==0.5
wincertstore==0.2
wrapt==1.11.2
xlrd==1.2.0
XlsxWriter @ file:///tmp/build/80754af9/xlsxwriter_1602692860603/work
xlwings==0.20.8
xlwt==1.3.0
xmltodict==0.12.0
yapf @ file:///tmp/build/80754af9/yapf_1593528177422/work
zict==2.0.0
zipp @ file:///tmp/build/80754af9/zipp_1604001098328/work
zope.event==4.5.0
zope.interface @ file:///C:/ci/zope.interface_1598606124374/work