Documentation/Source/eric5.DebugClients.Python.PyProfile.html

changeset 58
37f0444c3479
parent 21
b88a0e6268bd
child 409
0ea528e80202
equal deleted inserted replaced
57:81326a94fdca 58:37f0444c3479
20 </style> 20 </style>
21 </head> 21 </head>
22 <body><a NAME="top" ID="top"></a> 22 <body><a NAME="top" ID="top"></a>
23 <h1>eric5.DebugClients.Python.PyProfile</h1> 23 <h1>eric5.DebugClients.Python.PyProfile</h1>
24 <p> 24 <p>
25 &#77;&#111;&#100;&#117;&#108;&#101; &#100;&#101;&#102;&#105;&#110;&#105;&#110;&#103; &#97;&#100;&#100;&#105;&#116;&#105;&#111;&#110;&#115; &#116;&#111; &#116;&#104;&#101; &#115;&#116;&#97;&#110;&#100;&#97;&#114;&#100; &#80;y&#116;&#104;&#111;&#110; &#112;&#114;&#111;&#102;&#105;&#108;&#101;.&#112;y. 25 Module defining additions to the standard Python profile.py.
26 </p> 26 </p>
27 <h3>Global Attributes</h3> 27 <h3>Global Attributes</h3>
28 <table> 28 <table>
29 <tr><td>None</td></tr> 29 <tr><td>None</td></tr>
30 </table> 30 </table>
31 <h3>Classes</h3> 31 <h3>Classes</h3>
32 <table> 32 <table>
33 <tr> 33 <tr>
34 <td><a href="#PyProfile">PyProfile</a></td> 34 <td><a href="#PyProfile">PyProfile</a></td>
35 <td>&#67;&#108;&#97;&#115;&#115; &#101;x&#116;&#101;&#110;&#100;&#105;&#110;&#103; &#116;&#104;&#101; &#115;&#116;&#97;&#110;&#100;&#97;&#114;&#100; &#80;y&#116;&#104;&#111;&#110; &#112;&#114;&#111;&#102;&#105;&#108;&#101;&#114; w&#105;&#116;&#104; &#97;&#100;&#100;&#105;&#116;&#105;&#111;&#110;&#97;&#108; &#109;&#101;&#116;&#104;&#111;&#100;&#115;.</td> 35 <td>Class extending the standard Python profiler with additional methods.</td>
36 </tr> 36 </tr>
37 </table> 37 </table>
38 <h3>Functions</h3> 38 <h3>Functions</h3>
39 <table> 39 <table>
40 <tr><td>None</td></tr> 40 <tr><td>None</td></tr>
41 </table> 41 </table>
42 <hr /><hr /> 42 <hr /><hr />
43 <a NAME="PyProfile" ID="PyProfile"></a> 43 <a NAME="PyProfile" ID="PyProfile"></a>
44 <h2>PyProfile</h2> 44 <h2>PyProfile</h2>
45 <p> 45 <p>
46 &#67;&#108;&#97;&#115;&#115; &#101;x&#116;&#101;&#110;&#100;&#105;&#110;&#103; &#116;&#104;&#101; &#115;&#116;&#97;&#110;&#100;&#97;&#114;&#100; &#80;y&#116;&#104;&#111;&#110; &#112;&#114;&#111;&#102;&#105;&#108;&#101;&#114; w&#105;&#116;&#104; &#97;&#100;&#100;&#105;&#116;&#105;&#111;&#110;&#97;&#108; &#109;&#101;&#116;&#104;&#111;&#100;&#115;. 46 Class extending the standard Python profiler with additional methods.
47 </p><p> 47 </p><p>
48 &#84;&#104;&#105;&#115; &#99;&#108;&#97;&#115;&#115; &#101;x&#116;&#101;&#110;&#100;&#115; &#116;&#104;&#101; &#115;&#116;&#97;&#110;&#100;&#97;&#114;&#100; &#80;y&#116;&#104;&#111;&#110; &#112;&#114;&#111;&#102;&#105;&#108;&#101;&#114; &#98;y &#116;&#104;&#101; &#102;&#117;&#110;&#99;&#116;&#105;&#111;&#110;&#97;&#108;&#105;&#116;y &#116;&#111; 48 This class extends the standard Python profiler by the functionality to
49 &#115;&#97;v&#101; &#116;&#104;&#101; &#99;&#111;&#108;&#108;&#101;&#99;&#116;&#101;&#100; &#116;&#105;&#109;&#105;&#110;&#103; &#100;&#97;&#116;&#97; &#105;&#110; &#97; &#116;&#105;&#109;&#105;&#110;&#103; &#99;&#97;&#99;&#104;&#101;, &#116;&#111; &#114;&#101;&#115;&#116;&#111;&#114;&#101; &#116;&#104;&#101;&#115;&#101; &#100;&#97;&#116;&#97; 49 save the collected timing data in a timing cache, to restore these data
50 &#111;&#110; &#115;&#117;&#98;&#115;&#101;&#113;&#117;&#101;&#110;&#116; &#99;&#97;&#108;&#108;&#115;, &#116;&#111; &#115;&#116;&#111;&#114;&#101; &#97; &#112;&#114;&#111;&#102;&#105;&#108;&#101; &#100;&#117;&#109;&#112; &#116;&#111; &#97; &#115;&#116;&#97;&#110;&#100;&#97;&#114;&#100; &#102;&#105;&#108;&#101;&#110;&#97;&#109;&#101; &#97;&#110;&#100; 50 on subsequent calls, to store a profile dump to a standard filename and
51 &#116;&#111; &#101;&#114;&#97;&#115;&#101; &#116;&#104;&#101;&#115;&#101; &#99;&#97;&#99;&#104;&#101;&#115;. 51 to erase these caches.
52 </p> 52 </p>
53 <h3>Derived from</h3> 53 <h3>Derived from</h3>
54 profile.Profile 54 profile.Profile
55 <h3>Class Attributes</h3> 55 <h3>Class Attributes</h3>
56 <table> 56 <table>
58 </table> 58 </table>
59 <h3>Methods</h3> 59 <h3>Methods</h3>
60 <table> 60 <table>
61 <tr> 61 <tr>
62 <td><a href="#PyProfile.__init__">PyProfile</a></td> 62 <td><a href="#PyProfile.__init__">PyProfile</a></td>
63 <td>&#67;&#111;&#110;&#115;&#116;&#114;&#117;&#99;&#116;&#111;&#114;</td> 63 <td>Constructor</td>
64 </tr><tr> 64 </tr><tr>
65 <td><a href="#PyProfile.__restore">__restore</a></td> 65 <td><a href="#PyProfile.__restore">__restore</a></td>
66 <td>&#80;&#114;&#105;v&#97;&#116;&#101; &#109;&#101;&#116;&#104;&#111;&#100; &#116;&#111; &#114;&#101;&#115;&#116;&#111;&#114;&#101; &#116;&#104;&#101; &#116;&#105;&#109;&#105;&#110;&#103; &#100;&#97;&#116;&#97; &#102;&#114;&#111;&#109; &#116;&#104;&#101; &#116;&#105;&#109;&#105;&#110;&#103; &#99;&#97;&#99;&#104;&#101;.</td> 66 <td>Private method to restore the timing data from the timing cache.</td>
67 </tr><tr> 67 </tr><tr>
68 <td><a href="#PyProfile.dump_stats">dump_stats</a></td> 68 <td><a href="#PyProfile.dump_stats">dump_stats</a></td>
69 <td>&#80;&#117;&#98;&#108;&#105;&#99; &#109;&#101;&#116;&#104;&#111;&#100; &#116;&#111; &#100;&#117;&#109;&#112; &#116;&#104;&#101; &#115;&#116;&#97;&#116;&#105;&#115;&#116;&#105;&#99;&#115; &#100;&#97;&#116;&#97;.</td> 69 <td>Public method to dump the statistics data.</td>
70 </tr><tr> 70 </tr><tr>
71 <td><a href="#PyProfile.erase">erase</a></td> 71 <td><a href="#PyProfile.erase">erase</a></td>
72 <td>&#80;&#117;&#98;&#108;&#105;&#99; &#109;&#101;&#116;&#104;&#111;&#100; &#116;&#111; &#101;&#114;&#97;&#115;&#101; &#116;&#104;&#101; &#99;&#111;&#108;&#108;&#101;&#99;&#116;&#101;&#100; &#116;&#105;&#109;&#105;&#110;&#103; &#100;&#97;&#116;&#97;.</td> 72 <td>Public method to erase the collected timing data.</td>
73 </tr><tr> 73 </tr><tr>
74 <td><a href="#PyProfile.fix_frame_filename">fix_frame_filename</a></td> 74 <td><a href="#PyProfile.fix_frame_filename">fix_frame_filename</a></td>
75 <td>&#80;&#117;&#98;&#108;&#105;&#99; &#109;&#101;&#116;&#104;&#111;&#100; &#117;&#115;&#101;&#100; &#116;&#111; &#102;&#105;x&#117;&#112; &#116;&#104;&#101; &#102;&#105;&#108;&#101;&#110;&#97;&#109;&#101; &#102;&#111;&#114; &#97; &#103;&#105;v&#101;&#110; &#102;&#114;&#97;&#109;&#101;.</td> 75 <td>Public method used to fixup the filename for a given frame.</td>
76 </tr><tr> 76 </tr><tr>
77 <td><a href="#PyProfile.save">save</a></td> 77 <td><a href="#PyProfile.save">save</a></td>
78 <td>&#80;&#117;&#98;&#108;&#105;&#99; &#109;&#101;&#116;&#104;&#111;&#100; &#116;&#111; &#115;&#116;&#111;&#114;&#101; &#116;&#104;&#101; &#99;&#111;&#108;&#108;&#101;&#99;&#116;&#101;&#100; &#112;&#114;&#111;&#102;&#105;&#108;&#101; &#100;&#97;&#116;&#97;.</td> 78 <td>Public method to store the collected profile data.</td>
79 </tr><tr> 79 </tr><tr>
80 <td><a href="#PyProfile.trace_dispatch_call">trace_dispatch_call</a></td> 80 <td><a href="#PyProfile.trace_dispatch_call">trace_dispatch_call</a></td>
81 <td>&#80;&#114;&#105;v&#97;&#116;&#101; &#109;&#101;&#116;&#104;&#111;&#100; &#117;&#115;&#101;&#100; &#116;&#111; &#116;&#114;&#97;&#99;&#101; &#102;&#117;&#110;&#99;&#116;&#105;&#111;&#110;&#115; &#99;&#97;&#108;&#108;&#115;.</td> 81 <td>Private method used to trace functions calls.</td>
82 </tr> 82 </tr>
83 </table> 83 </table>
84 <a NAME="PyProfile.__init__" ID="PyProfile.__init__"></a> 84 <a NAME="PyProfile.__init__" ID="PyProfile.__init__"></a>
85 <h4>PyProfile (Constructor)</h4> 85 <h4>PyProfile (Constructor)</h4>
86 <b>PyProfile</b>(<i>basename, timer=None, bias=None</i>) 86 <b>PyProfile</b>(<i>basename, timer=None, bias=None</i>)
87 <p> 87 <p>
88 &#67;&#111;&#110;&#115;&#116;&#114;&#117;&#99;&#116;&#111;&#114; 88 Constructor
89 </p><dl> 89 </p><dl>
90 <dt><i>basename</i></dt> 90 <dt><i>basename</i></dt>
91 <dd> 91 <dd>
92 &#110;&#97;&#109;&#101; &#111;&#102; &#116;&#104;&#101; &#115;&#99;&#114;&#105;&#112;&#116; &#116;&#111; &#98;&#101; &#112;&#114;&#111;&#102;&#105;&#108;&#101;&#100; (&#115;&#116;&#114;&#105;&#110;&#103;) 92 name of the script to be profiled (string)
93 </dd><dt><i>timer</i></dt> 93 </dd><dt><i>timer</i></dt>
94 <dd> 94 <dd>
95 &#102;&#117;&#110;&#99;&#116;&#105;&#111;&#110; &#100;&#101;&#102;&#105;&#110;&#105;&#110;&#103; &#116;&#104;&#101; &#116;&#105;&#109;&#105;&#110;&#103; &#99;&#97;&#108;&#99;&#117;&#108;&#97;&#116;&#105;&#111;&#110; 95 function defining the timing calculation
96 </dd><dt><i>bias</i></dt> 96 </dd><dt><i>bias</i></dt>
97 <dd> 97 <dd>
98 &#99;&#97;&#108;&#105;&#98;&#114;&#97;&#116;&#105;&#111;&#110; v&#97;&#108;&#117;&#101; (&#102;&#108;&#111;&#97;&#116;) 98 calibration value (float)
99 </dd> 99 </dd>
100 </dl><a NAME="PyProfile.__restore" ID="PyProfile.__restore"></a> 100 </dl><a NAME="PyProfile.__restore" ID="PyProfile.__restore"></a>
101 <h4>PyProfile.__restore</h4> 101 <h4>PyProfile.__restore</h4>
102 <b>__restore</b>(<i></i>) 102 <b>__restore</b>(<i></i>)
103 <p> 103 <p>
104 &#80;&#114;&#105;v&#97;&#116;&#101; &#109;&#101;&#116;&#104;&#111;&#100; &#116;&#111; &#114;&#101;&#115;&#116;&#111;&#114;&#101; &#116;&#104;&#101; &#116;&#105;&#109;&#105;&#110;&#103; &#100;&#97;&#116;&#97; &#102;&#114;&#111;&#109; &#116;&#104;&#101; &#116;&#105;&#109;&#105;&#110;&#103; &#99;&#97;&#99;&#104;&#101;. 104 Private method to restore the timing data from the timing cache.
105 </p><a NAME="PyProfile.dump_stats" ID="PyProfile.dump_stats"></a> 105 </p><a NAME="PyProfile.dump_stats" ID="PyProfile.dump_stats"></a>
106 <h4>PyProfile.dump_stats</h4> 106 <h4>PyProfile.dump_stats</h4>
107 <b>dump_stats</b>(<i>file</i>) 107 <b>dump_stats</b>(<i>file</i>)
108 <p> 108 <p>
109 &#80;&#117;&#98;&#108;&#105;&#99; &#109;&#101;&#116;&#104;&#111;&#100; &#116;&#111; &#100;&#117;&#109;&#112; &#116;&#104;&#101; &#115;&#116;&#97;&#116;&#105;&#115;&#116;&#105;&#99;&#115; &#100;&#97;&#116;&#97;. 109 Public method to dump the statistics data.
110 </p><dl> 110 </p><dl>
111 <dt><i>file</i></dt> 111 <dt><i>file</i></dt>
112 <dd> 112 <dd>
113 &#110;&#97;&#109;&#101; &#111;&#102; &#116;&#104;&#101; &#102;&#105;&#108;&#101; &#116;&#111; w&#114;&#105;&#116;&#101; &#116;&#111; (&#115;&#116;&#114;&#105;&#110;&#103;) 113 name of the file to write to (string)
114 </dd> 114 </dd>
115 </dl><a NAME="PyProfile.erase" ID="PyProfile.erase"></a> 115 </dl><a NAME="PyProfile.erase" ID="PyProfile.erase"></a>
116 <h4>PyProfile.erase</h4> 116 <h4>PyProfile.erase</h4>
117 <b>erase</b>(<i></i>) 117 <b>erase</b>(<i></i>)
118 <p> 118 <p>
119 &#80;&#117;&#98;&#108;&#105;&#99; &#109;&#101;&#116;&#104;&#111;&#100; &#116;&#111; &#101;&#114;&#97;&#115;&#101; &#116;&#104;&#101; &#99;&#111;&#108;&#108;&#101;&#99;&#116;&#101;&#100; &#116;&#105;&#109;&#105;&#110;&#103; &#100;&#97;&#116;&#97;. 119 Public method to erase the collected timing data.
120 </p><a NAME="PyProfile.fix_frame_filename" ID="PyProfile.fix_frame_filename"></a> 120 </p><a NAME="PyProfile.fix_frame_filename" ID="PyProfile.fix_frame_filename"></a>
121 <h4>PyProfile.fix_frame_filename</h4> 121 <h4>PyProfile.fix_frame_filename</h4>
122 <b>fix_frame_filename</b>(<i>frame</i>) 122 <b>fix_frame_filename</b>(<i>frame</i>)
123 <p> 123 <p>
124 &#80;&#117;&#98;&#108;&#105;&#99; &#109;&#101;&#116;&#104;&#111;&#100; &#117;&#115;&#101;&#100; &#116;&#111; &#102;&#105;x&#117;&#112; &#116;&#104;&#101; &#102;&#105;&#108;&#101;&#110;&#97;&#109;&#101; &#102;&#111;&#114; &#97; &#103;&#105;v&#101;&#110; &#102;&#114;&#97;&#109;&#101;. 124 Public method used to fixup the filename for a given frame.
125 </p><p> 125 </p><p>
126 &#84;&#104;&#101; &#108;&#111;&#103;&#105;&#99; &#101;&#109;&#112;&#108;&#111;y&#101;&#100; &#104;&#101;&#114;&#101; &#105;&#115; &#116;&#104;&#97;&#116; &#105;&#102; &#97; &#109;&#111;&#100;&#117;&#108;&#101; w&#97;&#115; &#108;&#111;&#97;&#100;&#101;&#100; 126 The logic employed here is that if a module was loaded
127 &#102;&#114;&#111;&#109; &#97; .&#112;y&#99; &#102;&#105;&#108;&#101;, &#116;&#104;&#101;&#110; &#116;&#104;&#101; &#99;&#111;&#114;&#114;&#101;&#99;&#116; .&#112;y &#116;&#111; &#111;&#112;&#101;&#114;&#97;&#116;&#101; w&#105;&#116;&#104; 127 from a .pyc file, then the correct .py to operate with
128 &#115;&#104;&#111;&#117;&#108;&#100; &#98;&#101; &#105;&#110; &#116;&#104;&#101; &#115;&#97;&#109;&#101; &#112;&#97;&#116;&#104; &#97;&#115; &#116;&#104;&#101; .&#112;y&#99;. &#84;&#104;&#101; &#114;&#101;&#97;&#115;&#111;&#110; &#116;&#104;&#105;&#115; 128 should be in the same path as the .pyc. The reason this
129 &#108;&#111;&#103;&#105;&#99; &#105;&#115; &#110;&#101;&#101;&#100;&#101;&#100; &#105;&#115; &#116;&#104;&#97;&#116; w&#104;&#101;&#110; &#97; .&#112;y&#99; &#102;&#105;&#108;&#101; &#105;&#115; &#103;&#101;&#110;&#101;&#114;&#97;&#116;&#101;&#100;, &#116;&#104;&#101; 129 logic is needed is that when a .pyc file is generated, the
130 &#102;&#105;&#108;&#101;&#110;&#97;&#109;&#101; &#101;&#109;&#98;&#101;&#100;&#100;&#101;&#100; &#97;&#110;&#100; &#116;&#104;&#117;&#115; w&#104;&#97;&#116; &#105;&#115; &#114;&#101;&#97;&#100;&#97;&#98;&#108;&#101; &#105;&#110; &#116;&#104;&#101; &#99;&#111;&#100;&#101; &#111;&#98;&#106;&#101;&#99;&#116; 130 filename embedded and thus what is readable in the code object
131 &#111;&#102; &#116;&#104;&#101; &#102;&#114;&#97;&#109;&#101; &#111;&#98;&#106;&#101;&#99;&#116; &#105;&#115; &#116;&#104;&#101; &#102;&#117;&#108;&#108;y &#113;&#117;&#97;&#108;&#105;&#102;&#105;&#101;&#100; &#102;&#105;&#108;&#101;&#112;&#97;&#116;&#104; w&#104;&#101;&#110; &#116;&#104;&#101; 131 of the frame object is the fully qualified filepath when the
132 &#112;y&#99; &#105;&#115; &#103;&#101;&#110;&#101;&#114;&#97;&#116;&#101;&#100;. &#73;&#102; &#102;&#105;&#108;&#101;&#115; &#97;&#114;&#101; &#109;&#111;v&#101;&#100; &#102;&#114;&#111;&#109; &#109;&#97;&#99;&#104;&#105;&#110;&#101; &#116;&#111; &#109;&#97;&#99;&#104;&#105;&#110;&#101; 132 pyc is generated. If files are moved from machine to machine
133 &#116;&#104;&#105;&#115; &#99;&#97;&#110; &#98;&#114;&#101;&#97;&#107; &#100;&#101;&#98;&#117;&#103;&#103;&#105;&#110;&#103; &#97;&#115; &#116;&#104;&#101; .&#112;y&#99; w&#105;&#108;&#108; &#114;&#101;&#102;&#101;&#114; &#116;&#111; &#116;&#104;&#101; .&#112;y 133 this can break debugging as the .pyc will refer to the .py
134 &#111;&#110; &#116;&#104;&#101; &#111;&#114;&#105;&#103;&#105;&#110;&#97;&#108; &#109;&#97;&#99;&#104;&#105;&#110;&#101;. &#65;&#110;&#111;&#116;&#104;&#101;&#114; &#99;&#97;&#115;&#101; &#109;&#105;&#103;&#104;&#116; &#98;&#101; &#115;&#104;&#97;&#114;&#105;&#110;&#103; 134 on the original machine. Another case might be sharing
135 &#99;&#111;&#100;&#101; &#111;v&#101;&#114; &#97; &#110;&#101;&#116;w&#111;&#114;&#107;... &#84;&#104;&#105;&#115; &#108;&#111;&#103;&#105;&#99; &#100;&#101;&#97;&#108;&#115; w&#105;&#116;&#104; &#116;&#104;&#97;&#116;. 135 code over a network... This logic deals with that.
136 </p><dl> 136 </p><dl>
137 <dt><i>frame</i></dt> 137 <dt><i>frame</i></dt>
138 <dd> 138 <dd>
139 &#116;&#104;&#101; &#102;&#114;&#97;&#109;&#101; &#111;&#98;&#106;&#101;&#99;&#116; 139 the frame object
140 </dd> 140 </dd>
141 </dl><a NAME="PyProfile.save" ID="PyProfile.save"></a> 141 </dl><a NAME="PyProfile.save" ID="PyProfile.save"></a>
142 <h4>PyProfile.save</h4> 142 <h4>PyProfile.save</h4>
143 <b>save</b>(<i></i>) 143 <b>save</b>(<i></i>)
144 <p> 144 <p>
145 &#80;&#117;&#98;&#108;&#105;&#99; &#109;&#101;&#116;&#104;&#111;&#100; &#116;&#111; &#115;&#116;&#111;&#114;&#101; &#116;&#104;&#101; &#99;&#111;&#108;&#108;&#101;&#99;&#116;&#101;&#100; &#112;&#114;&#111;&#102;&#105;&#108;&#101; &#100;&#97;&#116;&#97;. 145 Public method to store the collected profile data.
146 </p><a NAME="PyProfile.trace_dispatch_call" ID="PyProfile.trace_dispatch_call"></a> 146 </p><a NAME="PyProfile.trace_dispatch_call" ID="PyProfile.trace_dispatch_call"></a>
147 <h4>PyProfile.trace_dispatch_call</h4> 147 <h4>PyProfile.trace_dispatch_call</h4>
148 <b>trace_dispatch_call</b>(<i>frame, t</i>) 148 <b>trace_dispatch_call</b>(<i>frame, t</i>)
149 <p> 149 <p>
150 &#80;&#114;&#105;v&#97;&#116;&#101; &#109;&#101;&#116;&#104;&#111;&#100; &#117;&#115;&#101;&#100; &#116;&#111; &#116;&#114;&#97;&#99;&#101; &#102;&#117;&#110;&#99;&#116;&#105;&#111;&#110;&#115; &#99;&#97;&#108;&#108;&#115;. 150 Private method used to trace functions calls.
151 </p><p> 151 </p><p>
152 &#84;&#104;&#105;&#115; &#105;&#115; &#97; v&#97;&#114;&#105;&#97;&#110;&#116; &#111;&#102; &#116;&#104;&#101; &#111;&#110;&#101; &#102;&#111;&#117;&#110;&#100; &#105;&#110; &#116;&#104;&#101; &#115;&#116;&#97;&#110;&#100;&#97;&#114;&#100; &#80;y&#116;&#104;&#111;&#110; 152 This is a variant of the one found in the standard Python
153 &#112;&#114;&#111;&#102;&#105;&#108;&#101;.&#112;y &#99;&#97;&#108;&#108;&#105;&#110;&#103; &#102;&#105;x&#95;&#102;&#114;&#97;&#109;&#101;&#95;&#102;&#105;&#108;&#101;&#110;&#97;&#109;&#101; &#97;&#98;&#111;v&#101;. 153 profile.py calling fix_frame_filename above.
154 </p> 154 </p>
155 <div align="right"><a href="#top">Up</a></div> 155 <div align="right"><a href="#top">Up</a></div>
156 <hr /> 156 <hr />
157 </body></html> 157 </body></html>

eric ide

mercurial