Python Debugging for AI, Machine Learning, and Cloud Computing: A Pattern-Oriented Approach 1st Edition Vostokov instant download
Python Debugging for AI, Machine Learning, and Cloud Computing: A Pattern-Oriented Approach 1st Edition Vostokov instant download
or textbooks at https://ebookmass.com
https://ebookmass.com/product/python-debugging-for-ai-
machine-learning-and-cloud-computing-a-pattern-oriented-
approach-1st-edition-vostokov/
https://ebookmass.com/product/artificial-intelligence-and-machine-
learning-for-edge-computing-1st-edition-rajiv-pandey/
Productionizing AI: How to Deliver AI B2B Solutions with
Cloud and Python 1st Edition Barry Walsh
https://ebookmass.com/product/productionizing-ai-how-to-deliver-
ai-b2b-solutions-with-cloud-and-python-1st-edition-barry-walsh/
https://ebookmass.com/product/productionizing-ai-how-to-deliver-
ai-b2b-solutions-with-cloud-and-python-1st-edition-barry-walsh-2/
https://ebookmass.com/product/foundations-of-arm64-linux-debugging-
disassembling-and-reversing-dmitry-vostokov/
Machine Learning Guide for Oil and Gas Using Python Hoss
Belyadi
https://ebookmass.com/product/machine-learning-guide-for-oil-and-gas-
using-python-hoss-belyadi/
Dmitry Vostokov
Apress Standard
The publisher, the authors, and the editors are safe to assume that the
advice and information in this book are believed to be true and accurate
at the date of publication. Neither the publisher nor the authors or the
editors give a warranty, expressed or implied, with respect to the
material contained herein or for any errors or omissions that may have
been made. The publisher remains neutral with regard to jurisdictional
claims in published maps and institutional affiliations.
1. Fundamental Vocabulary
Dmitry Vostokov1
Process
A Python script is interpreted by compiling it into bytecode and then executing it, or it
can even be precompiled into an application program. In both cases, this interpreter file
or the compiled application is an executable program (in Windows, it may have a .exe
extension) that references some operating system libraries (.dll in Windows and .so in
Linux). This application can be loaded into computer memory several times; each time, a
separate process is created with its own resources and unique process ID (PID, also
TGID), as shown in Figure 1-1. The process may also have a parent process that created it,
with a parent process ID (PPID).
Figure 1-1 Two python3 processes with two different PIDs
To illustrate, I executed the code in Listing 1-1 on both Windows and Linux twice.
import time
def main():
foo()
def foo():
bar()
def bar():
while True:
time.sleep(1)
if __name__ == "__main__":
main()
Listing 1-1 A Simple Script to Model Running Python Code
~/Chapter1$ ps -a
PID TTY TIME CMD
17 pts/0 00:00:00 mc
60 pts/2 00:00:00 python3
61 pts/1 00:00:00 python3
80 pts/3 00:00:00 ps
Note The operating system controls hardware and processes/threads. From a high
level, it is just a collection of processes with the operating system kernel as a process
too.
Thread
From an operating system perspective, a process is just a memory container for a Python
interpreter, its code, and data. But the interpreter code needs to be executed, for example,
to interpret the Python bytecode. This unit of execution is called a thread. A process may
have several such units of execution (several threads, the so-called multithreaded
application). Each thread has its own unique thread ID (TID, also LWP or SPID), as shown
in Figure 1-3. For example, one thread may process user interface events and others may
do complex calculations in response to UI requests, thus making the UI responsive. On
Windows, thread IDs are usually different from process IDs, but in Linux, the thread ID of
the main thread is the same as the process ID for a single-threaded process.
import time
import threading
def thread_func():
foo()
def main():
t1 = threading.Thread(target=thread_func)
t1.start()
t2 = threading.Thread(target=thread_func)
t2.start()
t1.join()
t2.join()
def foo():
bar()
def bar():
while True:
time.sleep(1)
if __name__ == "__main__":
main()
Listing 1-2 A Simple Script to Model Multiple Threads
Figure 1-4 shows that in Windows, you can see 11 threads at the beginning (this
number later changes to 7 and then to 5). You see that the number of threads may be
greater than expected.
Figure 1-4 The number of threads in the running python3.11.exe process on Windows
~/Chapter1$ ps -aT
PID SPID TTY TIME CMD
17 17 pts/0 00:00:00 mc
45 45 pts/2 00:00:00 python3
45 46 pts/2 00:00:00 python3
45 47 pts/2 00:00:00 python3
54 54 pts/1 00:00:00 ps
Stack Trace (Backtrace, Traceback)
I should distinguish Python source code tracebacks (which we call managed stack traces)
and unmanaged (native) ones from the Python compiler and interpreter that compiles to
and executes Python byte code. You will see this distinction in some chapters for several
case studies and how to get both traces. But, for now, I will just show the difference.
Listing 1-3 shows managed stack trace. Listing 1-4 shows the corresponding unmanaged
Linux stack trace with debugging symbols (the most recent call first). Listing 1-5 shows
the corresponding unmanaged Windows stack trace without debugging symbols (the
most recent call first).
00 00000090`7e1ef0a8
00007ff9`8c44fcf9 ntdll!NtWaitForMultipleObjects+0x14
01 00000090`7e1ef0b0
00007ff9`8c44fbfe KERNELBASE!WaitForMultipleObjectsEx+0xe9
02 00000090`7e1ef390
00007ff8`ef943986 KERNELBASE!WaitForMultipleObjects+0xe
03 00000090`7e1ef3d0
00007ff8`ef94383d python311!PyTraceBack_Print_Indented+0x35a
04 00000090`7e1ef430
00007ff8`ef81a6b2 python311!PyTraceBack_Print_Indented+0x211
05 00000090`7e1ef460
00007ff8`ef82fa77 python311!PyEval_EvalFrameDefault+0x8f2
06 00000090`7e1ef670
00007ff8`ef82f137 python311!PyMapping_Check+0x1eb
07 00000090`7e1ef6b0
00007ff8`ef82d80a python311!PyEval_EvalCode+0x97
08 00000090`7e1ef730
00007ff8`ef82d786 python311!PyMapping_Items+0x11e
09 00000090`7e1ef760
00007ff8`ef97a17e python311!PyMapping_Items+0x9a
0a 00000090`7e1ef7a0
00007ff8`ef7e33a5 python311!PyThread_tss_is_created+0x53ce
0b 00000090`7e1ef810
00007ff8`ef8da620 python311!PyRun_SimpleFileObject+0x11d
0c 00000090`7e1ef880
00007ff8`ef8daaef python311!PyRun_AnyFileObject+0x54
0d 00000090`7e1ef8b0
00007ff8`ef8dab5f python311!Py_MakePendingCalls+0x38f
0e 00000090`7e1ef980
00007ff8`ef8db964 python311!Py_MakePendingCalls+0x3ff
0f 00000090`7e1ef9b0
00007ff8`ef8db7f5 python311!Py_RunMain+0x184
10 00000090`7e1efa20
00007ff8`ef8260d9 python311!Py_RunMain+0x15
11 00000090`7e1efa50
00007ff6`aefe1230 python311!Py_Main+0x25
12 00000090`7e1efaa0 00007ff9`8e1c26ad python+0x1230
13 00000090`7e1efae0
00007ff9`8ef6a9f8 KERNEL32!BaseThreadInitThunk+0x1d
14 00000090`7e1efb10
00000000`00000000 ntdll!RtlUserThreadStart+0x28
Listing 1-5 Unmanaged Windows Stack Trace from the Execution of the Python Script from Listing 1-1
Without Debugging Symbols
Symbol Files
Symbol files allow a debugger to map memory addresses to symbolic information such as
function and variable names. For example, if you download and apply symbol files to the
Windows example above, you get a much better and more accurate stack trace, as shown
in Listing 1-6.
00 00000090`7e1ef0a8
00007ff9`8c44fcf9 ntdll!NtWaitForMultipleObjects+0x14
01 00000090`7e1ef0b0
00007ff9`8c44fbfe KERNELBASE!WaitForMultipleObjectsEx+0xe9
02 00000090`7e1ef390
00007ff8`ef943986 KERNELBASE!WaitForMultipleObjects+0xe
03 00000090`7e1ef3d0
00007ff8`ef94383d python311!pysleep+0x11a
04 00000090`7e1ef430
00007ff8`ef81a6b2 python311!time_sleep+0x2d
05 00000090`7e1ef460
00007ff8`ef82fa77 python311!_PyEval_EvalFrameDefault+0x8f2
06 (Inline Function) --------`-------
- python311!_PyEval_EvalFrame+0x1e
07 00000090`7e1ef670
00007ff8`ef82f137 python311!_PyEval_Vector+0x77
08 00000090`7e1ef6b0
00007ff8`ef82d80a python311!PyEval_EvalCode+0x97
09 00000090`7e1ef730
00007ff8`ef82d786 python311!run_eval_code_obj+0x52
0a 00000090`7e1ef760
00007ff8`ef97a17e python311!run_mod+0x72
0b 00000090`7e1ef7a0
00007ff8`ef7e33a5 python311!pyrun_file+0x196b66
0c 00000090`7e1ef810
00007ff8`ef8da620 python311!_PyRun_SimpleFileObject+0x11d
0d 00000090`7e1ef880
00007ff8`ef8daaef python311!_PyRun_AnyFileObject+0x54
0e 00000090`7e1ef8b0
00007ff8`ef8dab5f python311!pymain_run_file_obj+0x10b
0f 00000090`7e1ef980
00007ff8`ef8db964 python311!pymain_run_file+0x63
10 00000090`7e1ef9b0
00007ff8`ef8db7f5 python311!pymain_run_python+0x140
11 00000090`7e1efa20
00007ff8`ef8260d9 python311!Py_RunMain+0x15
12 00000090`7e1efa50
00007ff6`aefe1230 python311!Py_Main+0x25
13 (Inline Function) --------`-------
- python!invoke_main+0x22
14 00000090`7e1efaa0
00007ff9`8e1c26ad python!__scrt_common_main_seh+0x10c
15 00000090`7e1efae0
00007ff9`8ef6a9f8 KERNEL32!BaseThreadInitThunk+0x1d
16 00000090`7e1efb10
00000000`00000000 ntdll!RtlUserThreadStart+0x28
Listing 1-6 Unmanaged Windows Stack Trace from the Execution of the Python Script from Listing 1-1
with Debugging Symbols
Module
Like the distinction between managed and unmanaged stack traces, there is a difference
between Python modules (which may correspond to files in traceback) and native
modules such as DLLs in Windows and .so files in Linux, which are loaded into memory
when you execute the Python compiler/interpreter. For example, the following shared
libraries are loaded in Linux for the simple multithreaded example from Listing 1-2:
~/Chapter1$ pmap 60
60: python3 process.py
0000000000400000 132K r---- python3.7
0000000000421000 2256K r-x-- python3.7
0000000000655000 1712K r---- python3.7
0000000000801000 4K r---- python3.7
0000000000802000 664K rw--- python3.7
00000000008a8000 140K rw--- [ anon ]
0000000001fff000 660K rw--- [ anon ]
00007f6bc7f69000 1684K rw--- [ anon ]
00007f6bc810e000 2964K r---- locale-archive
00007f6bc83f3000 12K rw--- [ anon ]
00007f6bc83f6000 136K r---- libc-2.28.so
00007f6bc8418000 1308K r-x-- libc-2.28.so
00007f6bc855f000 304K r---- libc-2.28.so
00007f6bc85ab000 4K ----- libc-2.28.so
00007f6bc85ac000 16K r---- libc-2.28.so
00007f6bc85b0000 8K rw--- libc-2.28.so
00007f6bc85b2000 16K rw--- [ anon ]
00007f6bc85b6000 52K r---- libm-2.28.so
00007f6bc85c3000 636K r-x-- libm-2.28.so
00007f6bc8662000 852K r---- libm-2.28.so
00007f6bc8737000 4K r---- libm-2.28.so
00007f6bc8738000 4K rw--- libm-2.28.so
00007f6bc8739000 8K rw--- [ anon ]
00007f6bc873b000 12K r---- libz.so.1.2.11
00007f6bc873e000 72K r-x-- libz.so.1.2.11
00007f6bc8750000 24K r---- libz.so.1.2.11
00007f6bc8756000 4K ----- libz.so.1.2.11
00007f6bc8757000 4K r---- libz.so.1.2.11
00007f6bc8758000 4K rw--- libz.so.1.2.11
00007f6bc8759000 16K r---- libexpat.so.1.6.8
00007f6bc875d000 132K r-x-- libexpat.so.1.6.8
00007f6bc877e000 80K r---- libexpat.so.1.6.8
00007f6bc8792000 4K ----- libexpat.so.1.6.8
00007f6bc8793000 8K r---- libexpat.so.1.6.8
00007f6bc8795000 4K rw--- libexpat.so.1.6.8
00007f6bc8796000 4K r---- libutil-2.28.so
00007f6bc8797000 4K r-x-- libutil-2.28.so
00007f6bc8798000 4K r---- libutil-2.28.so
00007f6bc8799000 4K r---- libutil-2.28.so
00007f6bc879a000 4K rw--- libutil-2.28.so
00007f6bc879b000 4K r---- libdl-2.28.so
00007f6bc879c000 4K r-x-- libdl-2.28.so
00007f6bc879d000 4K r---- libdl-2.28.so
00007f6bc879e000 4K r---- libdl-2.28.so
00007f6bc879f000 4K rw--- libdl-2.28.so
00007f6bc87a0000 24K r---- libpthread-2.28.so
00007f6bc87a6000 60K r-x-- libpthread-2.28.so
00007f6bc87b5000 24K r---- libpthread-2.28.so
00007f6bc87bb000 4K r---- libpthread-2.28.so
00007f6bc87bc000 4K rw--- libpthread-2.28.so
00007f6bc87bd000 16K rw--- [ anon ]
00007f6bc87c1000 4K r---- libcrypt-2.28.so
00007f6bc87c2000 24K r-x-- libcrypt-2.28.so
00007f6bc87c8000 8K r---- libcrypt-2.28.so
00007f6bc87ca000 4K ----- libcrypt-2.28.so
00007f6bc87cb000 4K r---- libcrypt-2.28.so
00007f6bc87cc000 4K rw--- libcrypt-2.28.so
00007f6bc87cd000 192K rw--- [ anon ]
00007f6bc8801000 28K r--s- gconv-modules.cache
00007f6bc8808000 4K r---- ld-2.28.so
00007f6bc8809000 120K r-x-- ld-2.28.so
00007f6bc8827000 32K r---- ld-2.28.so
00007f6bc882f000 4K r---- ld-2.28.so
00007f6bc8830000 4K rw--- ld-2.28.so
00007f6bc8831000 4K rw--- [ anon ]
00007ffc6026a000 132K rw--- [ stack ]
00007ffc60356000 16K r---- [ anon ]
00007ffc6035a000 4K r-x-- [ anon ]
total 14700K
The Windows version has the following loaded modules:
Memory Dump
A process memory can be saved in a memory dump file.
These memory dumps are also called core dumps in Linux. It is also possible to get a
kernel memory dump and a dump of physical memory (also called a complete memory
dump in Windows). Figure 1-5 shows different memory dump types.
Crash
To fail suddenly. “Has the system just crashed?” “Something crashed the OS!” Also
used transitively to indicate the cause of the crash (usually a person or a program, or
both). “Those idiots playing SPACEWAR crashed the system.”
Eric S. Raymond, The New Hacker’s Dictionary, Third Edition.
When something illegal happens inside a process thread, such as when memory
outside its available range is accessed or you write to read-only memory, the operating
system reports the error and terminates the process. It may also save the process
memory into a memory dump file. The process then disappears from the list of available
processes.
Hang
1. To wait for an event that will never occur. “The system is hanging because it can’t
read from the crashed drive.”
2. To wait for an event to occur. “The program displays a menu and then hangs until
you type a character.”
Eric S. Raymond, The New Hacker’s Dictionary, Third Edition
Threads interact with other threads, including other processes’ threads. These
interactions can be viewed as sending messages and waiting for the responses. Some
processes may be critical because their threads process messages from many other
threads from other processes. If threads from such a critical process stop sending
responses, all other waiting threads are blocked. A deadlock is when two threads are
waiting for each other. When hanging, the process continues to be present in the list of
available processes. There are also processes (critical components) that, when their
threads hang, block threads from many other processes (noncritical components). Figure
1-6 depicts such components and their interaction abstracted via messages in the normal
scenario, and Figure 1-7 shows the abnormal scenario when noncritical components are
blocked and waiting for responses because the critical components are deadlocked.
Figure 1-6 Request and response interaction between critical and noncritical system components
Figure 1-7 Blocked and deadlocked components
Summary
In this chapter, you learned the fundamental vocabulary you will use in subsequent
chapters. The next chapter introduces a pattern-oriented debugging approach.
© The Author(s), under exclusive license to APress Media, LLC, part of Springer
Nature 2024
D. Vostokov, Python Debugging for AI, Machine Learning, and Cloud Computing
https://doi.org/10.1007/978-1-4842-9745-2_2
2. Pattern-Oriented Debugging
Dmitry Vostokov1
Development Process
Let’s first look at the traditional software development process stages.
Figure 2-1 abstracts them from several development processes,
including waterfall and iterative ones.
Figure 2-1 Stages of the typical software development process
Development Patterns
For each stage, there exists some pattern language such as a vocabulary
of solutions to common recurrent identifiable problems with grammar,
semantics, and pragmatics. Figure 2-2 also includes software usage and
presentation patterns for human-computer interaction. In this book, I
assume you have familiarity with such pattern languages (some
references are provided below).
Figure 2-2 Typical software development pattern languages
Summary
In this chapter, you learned about the pattern-oriented debugging
process, its stages, and corresponding pattern languages. The
subsequent chapters provide examples of debugging patterns from
each category from a Python programming perspective. The next
chapter is about the first stage and its patterns: elementary diagnostics
patterns.
Footnotes
1 Mehdi Amoui et al., “A Pattern Language for Software Debugging,” International
Journal of Computer Science, vol. 1, no. 3, pp. 218-224, 2006.
https://stargroup.uwaterloo.ca/~mamouika/papers/pdf/IJCS.2006
.pdf
9. OPERATION OF VEHICLE.
a. Starting on Level Ground. The engine having been warmed
up and checked for satisfactory operation, the vehicle (with operator
in riding position) is put in motion as follows:
(1) Transfer body weight to right leg.
(2) Fold back side stand (jiffy stand).
(3) Disengage clutch by depressing clutch foot pedal with heel of
left foot.
(4) Shift gear shifter lever into “1” (low) gear position.
(5) Slowly engage clutch by depressing clutch foot pedal with toe
of left foot.
(6) When clutch starts to “take hold,” open throttle sufficiently to
maintain engine speed.
(7) Accelerate gradually to between 12 and 15 miles per hour in
low gear.
(8) Close throttle quickly.
(9) Disengage clutch.
(10) Shift through “N” (neutral) position into “2” (second) gear.
(11) Reengage clutch and accelerate to about 25 miles per hour.
(12) Close throttle quickly.
(13) Disengage clutch.
(14) Shift into “3” (high) gear.
(15) Reengage clutch and accelerate to desired speed.
b. Starting on Uneven or Soft Ground.
(1) If standing on an incline or in loose, heavy ground, more
engine power will be required to start vehicle without stalling engine.
(2) It may be necessary to keep vehicle from rolling by keeping
pressure on front brake hand lever. Brake pressure is released after
vehicle starts in forward motion.
(3) Open throttle and engage clutch at same time to provide
power needed for starting, without racing engine unnecessarily.
(4) Motorcycle starts should be made without excessive
application of power, with consequent unnecessary spinning of rear
wheel.
Paragraph
Purpose 14
Before‐operation service 15
During‐operation service 16
At‐halt service 17
After‐operation and weekly service 18
14. PURPOSE.
a. To insure mechanical efficiency it is necessary that the vehicle
be systematically inspected at intervals each day it is operated and
weekly, so that defects may be discovered and corrected before they
result in serious damage or failure. Certain scheduled maintenance
services will be performed at these designated intervals. The
services set forth in this section are those performed by driver or
crew before operation, during operation, at halt, after operation, and
weekly.
b. Driver preventive maintenance services are listed on the back
of “Driver’s Trip Ticket and Preventive Maintenance Service Record,”
W.D. Form No. 48, to cover vehicles of all types and models. Items
peculiar to specific vehicles, but not listed on W.D. Form No. 48, are
covered in manual procedures under the items to which they are
related. Certain items listed on the form that do not pertain to the
vehicle involved are eliminated from the procedures as written into
the manual. Every organization must thoroughly school each driver
in performing the maintenance procedures set forth in manuals,
whether or not they are listed specifically on W.D. Form No. 48.
c. The items listed on W.D. Form No. 48 that apply to this vehicle
are expanded in this manual to provide specific procedures for
accomplishment of the inspections and services. These services are
arranged to facilitate inspection and conserve the time of the driver,
and are not necessarily in the same numerical order as shown on
W.D. Form No. 48. The item numbers, however, are identical with
those shown on that form.
d. The general inspection of each item applies also to any
supporting member or connection, and generally includes a check to
see whether the item is in good condition, correctly assembled,
secure, or excessively worn.
(1) The inspection for “good condition” is usually an external
visual inspection to determine whether the unit is damaged beyond
safe or serviceable limits. The term “good condition” is explained
further by the following: not bent or twisted, not chafed or burned,
not broken or cracked, not bare or frayed, not dented or collapsed,
not torn or cut.
(2) The inspection of a unit to see that it is “correctly assembled”
is usually an external visual inspection to see whether it is in its
normal assembled position in the vehicle.
(3) The inspection of a unit to determine if it is “secure” is usually
an external visual examination, a hand‐feel, or a pry‐bar check for
looseness. Such an inspection should include any brackets, lock
washers, lock nuts, locking wires, or cotter pins used in assembly.
(4) “Excessively worn” will be understood to mean worn close to,
or beyond, serviceable limits, and likely to result in a failure if not
replaced before the next scheduled inspection.
e. Any defects or unsatisfactory operating characteristics beyond
the scope of first echelon to correct must be reported at the earliest
opportunity to the designated individual in authority.
(12) Item 52, Appearance and Glass. Clean windshield, rear view
mirror, and light lenses; inspect for good condition, secure
attachment, and broken glass.
LUBRICATION
Paragraph
Introduction 19
Lubrication guide 20
19. INTRODUCTION.
a. Lubrication is an essential part of preventive maintenance,
determining to a great extent serviceability of parts and assemblies.
RA PD 310207
Figure 10—Lubrication Guide
Paragraph
Vehicle tools 21
Vehicle equipment 22
Vehicle spare parts 23
RA PD 310208
Figure 11—Vehicle Tools
Legend
Letter Federal
for Number Mfr’s Stock Where
Fig. 11 Tool Carried Number Number Carried
A 11819– In saddle
Tool roll
1 44 —— bag
B 11551– 41–I–773– In tool
Irons, tire
2 X 75 roll
*C 11817– 41–H– In tool
Handle, chain tool
1 40 1510–400 roll
D Wrench, 8–in. by ¾–
5⁄
11804– In tool
in. 1 44C —— roll
E Wrench, ½–in. by 9⁄16– 11804– In tool
in. 1 44B —— roll
F Wrench, 7⁄16–in. by ½– 11804– In tool
in. 1 44A —— roll
G Wrench, 5⁄16–in. by 3⁄8– 11804– In tool
in. 1 44 —— roll
H Wrench, ⅜–in. by 7⁄16– 11905– In tool
in. (valve tappet) 1 X —— roll
I 11813– In tool
Wrench, adjustable
1 44 —— roll
*J Wrench, ¾–in. by 1¾–
in. (rear axle nut 11814– 41–W– In tool
and trans.) 1 35 1989–850 roll
K 11562– In tool
Gage, tire
1 43 —— roll
*L 12039– In tool
Tool, chain repair
1 38 —— roll
*M Washers, 0.002–in.
thick (chain oiler 674– In tool
adj.) 4 32 —— roll
*N Wrench, 7⁄16–in. by
1⅜–in. (valve 11806– 41–W– In tool
cover) 1 31 3617 roll
*O Wrench, 7⁄16–in. by
11⁄8–in. (use with 11929– In tool
spark plug socket) 1 39 —— roll
*P 11812– In tool
Pliers, adjustable
1 44 —— roll
*Q 11811– In tool
Screwdriver
1 X —— roll
R Wrench, 9⁄16–in. socket 12047– 41– In tool
(cyl. head bolt) 1 30A W01525 roll
*S Wrench, wheel 11815– 41–W– In tool
mounting 1 35 3825–400 roll
*T Wrench, socket (spark 11805– 41–W– In tool
plug; use with O) 1 40 3332 roll
On
Pump, tire 11553– frame,
1 41M 8–P–4900 left side
11661– In saddle
Grease gun (in case)
1 38A —— bag
*EXCEPTION: Earlier models furnished with smaller tool roll and
kit contain the items marked by asterisk.
Number
Item
Carried Where Carried
Saddlebags 2 On luggage carrier
Mirror, rear view 1 On left handle bar
Box, submachine gun
ammunition 1 Front fender, left side
Bracket, submachine gun carrier Front fender, right
1 side
Guard, front safety 1 Attached to frame
Guard, rear safety 1 Attached to frame
Windshield, cpt 1 On handle bar
Leg shields, cpt (right and left) 2 Attached to frame
RA PD 310216
Figure 12—Vehicle Equipment, Left Side
RA PD 310217
Figure 13—Vehicle Equipment, Right Side
RA PD 310209
Figure 14—Vehicle Spare Parts
ebookmasss.com