Difference between revisions of "Debugging OOo"
Line 1: | Line 1: | ||
− | == | + | == logs of IRC Lectures On Debugging openoffice.org == |
+ | |||
+ | == Lecturer Eric Bachard, [http://education.openoffice.org/ Openoffice.org Ecucation Project leader] == | ||
= First Session = | = First Session = |
Revision as of 13:51, 8 April 2009
Contents
logs of IRC Lectures On Debugging openoffice.org
Lecturer Eric Bachard, Openoffice.org Ecucation Project leader
First Session
1 : [11:54] <@ericb2> fardad: ok, let's go 2 : �01[11:54] <@fardad> ericb2: Thank you in advance for taking time and lecturing us! 3 : [11:54] <@ericb2> To make things more easy, everything will be avaulable on the wiki afterwards 4 : [11:54] <@ericb2> fardad: you're welcome 5 : [11:55] <@ericb2> @all : if ever you detect something wrong, please let me know, or better fix it on the wiki afterwards 6 : [11:55] <@ericb2> thanks in advance 7 : [11:55] <@ericb2> Outline of the ClassRoom : 8 : [11:55] <@ericb2> 1) Create patches using svn 9 : [11:55] <@ericb2> 2) apply a patch 10 : [11:55] <@ericb2> 3) rebuild a module 11 : [11:55] <@ericb2> 4) rebuild a module including symbols 12 : [11:55] <@ericb2> 5) run OOo with gdb (introduction of gdb use) 13 : [11:55] <@ericb2> that's what we'll try to do 14 : [11:56] <@ericb2> if you have questions, please do 15 : [11:56] <@ericb2> fardad: we have ~1 hour 16 : [11:56] <@ericb2> fardad: is it ok ? 17 : [11:56] <IZBot> News from cws: native222: nominated || hr59: nominated 18 : �01[11:56] <@fardad> ericb2: sure, but just letting you know that students have 1hour 30 minutes 19 : [11:57] <@ericb2> fardad: well, they will experiment and ask then :-) 20 : [11:57] <@ericb2> Introduction : in this part, we will create, apply patches using svn tool. To simplify, we'll suppose the patches are in unified mode. 21 : [11:57] <@ericb2> Means: 22 : [11:57] <@ericb2> - 3 lines of context before the change 23 : [11:57] <@ericb2> - a line who starts with " - " means the line before the old version (if the old version was existing) 24 : [11:57] <@ericb2> - a line starting with " + " means after the change(s), if a new version does exist 25 : [11:57] <@ericb2> - 3 lines of context after the change 26 : [11:58] <@ericb2> The most important with unified mode : patches are human readable 27 : [11:58] <@ericb2> For example : 28 : [11:58] <@ericb2> ordinateur-de-eric-b-2:~/Desktop/ecntablet01 ericb$ svn diff sd/source/ui/slideshow/slideshow.hrc 29 : [11:58] <@ericb2> Index: sd/source/ui/slideshow/slideshow.hrc 30 : [11:58] <@ericb2> =================================================================== 31 : [11:58] <@ericb2> --- sd/source/ui/slideshow/slideshow.hrc (revision 267130) 32 : [11:58] <@ericb2> +++ sd/source/ui/slideshow/slideshow.hrc (working copy) 33 : [11:58] <@ericb2> @@ -38,8 +38,10 @@ 34 : [11:58] <@ericb2> #define CM_SCREEN_BLACK 5 35 : [11:58] <@ericb2> #define CM_SCREEN_WHITE 6 36 : [11:58] <@ericb2> #define CM_ENDSHOW 7 37 : [11:58] <@ericb2> -#define CM_FIRST_SLIDE 8 38 : [11:58] <@ericb2> -#define CM_LAST_SLIDE 9 39 : [11:58] <@ericb2> -#define CM_SLIDES 10 40 : [11:58] <@ericb2> +#define CM_ERASE_ALLINK 8 41 : [11:58] <@ericb2> +#define CM_ERASE_INK 9 42 : [11:58] <@ericb2> +#define CM_FIRST_SLIDE 10 43 : [11:58] <@ericb2> +#define CM_LAST_SLIDE 11 44 : [11:58] <@ericb2> +#define CM_SLIDES 12 45 : [11:58] <@ericb2> 46 : [11:58] <@ericb2> #endif 47 : [11:58] <@ericb2> As you can see, the - mean : the line is the previous version 48 : [11:59] <@ericb2> the + the new one 49 : [11:59] <@ericb2> in this patch, the deve loper added new constants 50 : [11:59] <@ericb2> 1) Create patches using svn 51 : [11:59] <@ericb2> Lot of possibilities. Below some of them. Probably better solutions do exist. This is just a little inventory of the possibilities. 52 : [11:59] <@ericb2> 1.1) you got a tree, did some modifications, and you want to send the patch to a friend 53 : [12:00] <@ericb2> To visualize the changes : 54 : [12:00] <@ericb2> ordinateur-de-eric-b-2:~/Desktop/moz2seamonkey01 ericb$ svn diff slideshow/source/inc/userpainteventhandler.hxx 55 : [12:00] <@ericb2> The command (without the prompt) is : 56 : [12:00] <@ericb2> svn diff slideshow/source/inc/userpainteventhandler.hxx 57 : [12:00] <@ericb2> Comment: we only check the changes in 1 filme there 58 : [12:00] <@ericb2> The result is : 59 : [12:00] <@ericb2> Index: slideshow/source/inc/userpainteventhandler.hxx 60 : [12:00] <@ericb2> =================================================================== 61 : [12:00] <@ericb2> --- slideshow/source/inc/userpainteventhandler.hxx (revision 267652) 62 : [12:00] <@ericb2> +++ slideshow/source/inc/userpainteventhandler.hxx (working copy) 63 : [12:00] <@ericb2> @@ -53,6 +53,9 @@ 64 : [12:00] <@ericb2> virtual ~UserPaintEventHandler() {} 65 : [12:01] <@ericb2> 66 : [12:01] <@ericb2> virtual bool colorChanged( RGBColor const& rUserColor ) = 0; 67 : [12:01] <@ericb2> + 68 : [12:01] <@ericb2> + virtual bool eraseAllInkChanged(bool const& rEraseAllInk) =0; 69 : [12:01] <@ericb2> + virtual bool eraseInkChanged(bool const& rEraseInk) =0; 70 : [12:01] <@ericb2> virtual bool disable() = 0; 71 : [12:01] <@ericb2> }; 72 : [12:01] <@ericb2> Now, to create the patch for true, the command is 73 : [12:01] <@ericb2> svn diff slideshow/source/inc/userpainteventhandler.hxx > my pretty patch.diff 74 : [12:01] <@ericb2> And " my_pretty_patch.diff " will contain the same. 75 : [12:01] <achan66> sorry what do you mean patch for true> 76 : [12:01] <achan66> ? 77 : [12:02] <@ericb2> Remark: if you are domain developer, you'll be asked for your passphrase 78 : [12:02] <@ericb2> achan66: the first command line returns everything on the standard output -> the screen 79 : [12:02] <achan66> okay thanks 80 : [12:02] <@ericb2> achan66: you're welcome :) 81 : [12:02] <@ericb2> 1.2) you want to create a patch between a cws and a milestone (the one the cws is based on ) 82 : [12:02] <@ericb2> For example, to extract the changes in helpcontent2, ab65 introduced 83 : [12:03] <@ericb2> ab65 is the cws name, and was based on DEV300_m35 84 : [12:03] <@ericb2> in one line : 85 : [12:03] <@ericb2> svn diff http://svn.services.openoffice.org/ooo/tags/DEV300_m35/helpcontent2 http://svn.services.openoffice.org/ooo/cws/ab65/helpcontent2 > mydiff.diff 86 : [12:04] <@ericb2> Comment : as you can see, we use URLs, means you need a working internet connexion, and subversion installed :-) 87 : [12:04] <@ericb2> Important: for the eventual commiters, svn 1.5.4 or more is *mandatory* to avoid creating garbage in the dev tree :) 88 : [12:04] <@ericb2> 1.3) you want to create a patch between two svn revisions for a given cws 89 : [12:05] <@ericb2> Tip : you can follow the recent commits there : http://cia.vc/stats/project/OOo 90 : [12:05] <Kamots> ab65 is the cws name, and was based on DEV300_m35 91 : [12:05] <@ericb2> Example of change (in one line) : 92 : [12:05] <@ericb2> Kamots: exactly 93 : [12:05] <@ericb2> svn diff http://svn.services.openoffice.org/ooo/cws/ooo31gsl2/vcl@268180 http://svn.services.openoffice.org/ooo/cws/ooo31gsl2/vcl@268182 94 : [12:05] <Kamots> oh sorry! my mouse slipped 95 : [12:06] <@ericb2> Remark : the revision syntax is @number 96 : [12:06] <@ericb2> Other possible syntax : dates are allowed 97 : [12:06] <@ericb2> 1.4) using svn log, you want to create the diff between two revisions of the same file 98 : [12:07] <@ericb2> For example : 99 : [12:07] <@ericb2> ordinateur-de-eric-b-2:~/Desktop/moz2seamonkey01 ericb$ svn log configure.in 100 : [12:07] <@ericb2> Means: I'm working in moz2seamonkey01 tree ( svn info will confirm ) 101 : [12:08] <@ericb2> Just some of the returned lines : 102 : [12:08] <@ericb2> (because the log is very long for some often modified files ) 103 : [12:08] <@ericb2> r267684 | ericb | 2009-02-12 18:13:52 +0100 (Thu, 12 Feb 2009) | 1 line 104 : [12:08] <@ericb2> #i94628# fix a path issue for finding seamonkey01 105 : [12:08] <@ericb2> ------------------------------------------------------------------------ 106 : [12:08] <@ericb2> r267656 | ericb | 2009-02-12 14:13:21 +0100 (Thu, 12 Feb 2009) | 1 line 107 : [12:08] <@ericb2> #i94628# other missing changes for Windows 108 : [12:08] <IZBot> porting DEFECT RESOLVED FIXED P3 make seamonkey 1.1.x buildable on Mac OS X http://qa.openoffice.org/issues/show_bug.cgi?id=94628 109 : [12:08] <IZBot> porting DEFECT RESOLVED FIXED P3 make seamonkey 1.1.x buildable on Mac OS X http://qa.openoffice.org/issues/show_bug.cgi?id=94628 110 : [12:10] <@ericb2> lol :) 111 : [12:10] <@ericb2> Practice : try to find the command line yourself ;) 112 : �01[12:10] <@fardad> :) 113 : [12:10] <@ericb2> That's enough for the first part, about create a diff 114 : [12:11] <@ericb2> and other possibilities do exist. What I wanted to show, is you'll have to experiment by yourself, and choose the most adapted to your case 115 : [12:11] <@ericb2> questions ? 116 : [12:12] <jPau> nope 117 : [12:12] <Kamots> so there is no patch command that will generate a .patch file for all modified files? 118 : [12:12] <daeseon_> no 119 : [12:12] <BartB> no questions here 120 : [12:13] <@ericb2> Kamots: diff or svn diff will create a patch. Patch is the next part, and this command will *apply* it 121 : [12:13] <achan66> ic, so far none 122 : [12:13] <@ericb2> I'd like to add an important information 123 : [12:14] <@ericb2> .diff or .patch are the most used suffixes 124 : [12:14] <l_zahir> what happens when a patch fails to be applied? 125 : [12:14] <Kamots> oh ok, thank you 126 : [12:14] <@ericb2> the reason is simple 127 : [12:14] <@ericb2> some editors, when they read .diff or .patch extension, have colored syntax, what is basically interesting 128 : [12:15] <@ericb2> means: you are free to rename your patch whatever you want, but use .diff or .patch as suffix, is generally a good idea 129 : [12:15] <@ericb2> l_zahir: I'll treat the case 130 : [12:15] <@ericb2> l_zahir: in the second part. 131 : [12:15] <l_zahir> ok thanks 132 : [12:16] <WFred__> does this apply to non-C++ code such as PERL?? 133 : [12:16] <@ericb2> WFred__: so far, diff can diff everything 134 : [12:16] <WFred__> :D 135 : [12:16] <@ericb2> WFred__: just use -a when you are diffing binary files 136 : [12:16] <@ericb2> WFred__: just try 137 : [12:17] <WFred__> what does the -a option do? 138 : [12:17] <@ericb2> WFred__: in OOo source tree we have makefiles, C++ , Java, Python , whatever 139 : [12:17] <@ericb2> WFred__: even .jpg or binaries blobs 140 : [12:18] <@ericb2> WFred__: man diff told me " treat all files as text" 141 : [12:18] <@ericb2> WFred__: usefull when binaries are diff'ed 142 : [12:18] <WFred__> oh ok thanks 143 : [12:18] <@ericb2> WFred__: to be sure, you can use diff -Naur old_tree new_tree 144 : [12:19] <@ericb2> WFred__: more precisely : diff -Naur old_tree new_tree W > my_patch.diff 145 : [12:19] <@ericb2> Part 2 : 146 : [12:19] <@ericb2> Apply a patch 147 : [12:19] <@ericb2> Essential options : 148 : [12:19] <@ericb2> --dry-run : fakes the patch application *extremely usefull* if you want to check whether a patch will apply, without create garbage in your tree 149 : [12:20] <@ericb2> -R : reverse it -> we suppose you already applied the patch, did no change and want to reverse the patch, to retrieve the same code as before 150 : [12:20] <@ericb2> -p0 : apply a patch using the exact path the files have. Important: your tree does match with the path of the file the patch will be applied, *AND* 151 : [12:20] <@ericb2> you apply it from the right location 152 : [12:20] <@ericb2> -p1 : you remove the first subdir of the path for every to be patched file listed in th patch 153 : [12:21] <@ericb2> -p2 you remove two .. and so on 154 : [12:21] <@ericb2> Correct way of application : 155 : [12:21] <@ericb2> Fake the application : 156 : [12:21] <@ericb2> patch --dry-run -p0 < my_patch.diff 157 : [12:21] <@ericb2> If nothing wrong occurs, remove the --dry-run option, and apply it for true : 158 : [12:21] <@ericb2> patch -p0 < my_patch.diff 159 : [12:22] <@ericb2> Other possibility, not recommended because of the UUOC (useless use of cat) : 160 : [12:22] <@ericb2> cat my_patch.diff | patch -p0 161 : [12:22] <@ericb2> Now, something important, people do not understand easely 162 : [12:22] <@ericb2> Depth of the application: 163 : [12:22] <@ericb2> e.g. let's suppose a patch has to modify 164 : [12:23] <@ericb2> vcl/source/aqua/source/window/salframeview.mm 165 : [12:23] <@ericb2> vcl/source/aqua/source/gdi/salprn.cxx 166 : [12:23] <@ericb2> vcl/source/aqua/inc/salframeview.h 167 : [12:23] <@ericb2> You can apply the patch from : 168 : [12:23] <@ericb2> 1) the root of the sources : 169 : [12:23] <@ericb2> patch -p0 < my_patch.diff 170 : [12:23] <@ericb2> 2) inside vcl : 171 : [12:23] <@ericb2> but you have to remove the first element of the path for every patched file 172 : [12:24] <@ericb2> patch -p1 < my_patch.diff 173 : [12:24] <@ericb2> (was -p0) 174 : [12:24] <@ericb2> 3) inside vcl/aqua 175 : [12:24] <@ericb2> patch -p2 < my_patch.diff 176 : [12:24] <@ericb2> BUT ... 177 : [12:24] <@ericb2> You cannot apply patch from elsewhere, because the paths will no longer match with the one every of the file contained in it. 178 : [12:25] <@ericb2> Other case 179 : [12:25] <@ericb2> 3) mix of applying patches + svn use 180 : [12:25] <@ericb2> e.g. you did a wrong change in a module, and you want to reverse it directly : 181 : [12:25] <@ericb2> cd module 182 : [12:25] <@ericb2> svn diff apath/afile.cxx | patch -R -p0 183 : [12:25] <@ericb2> will reverse the bad changes 184 : [12:25] <@ericb2> Other similar case : 185 : [12:26] <@ericb2> for the entire local tree this time 186 : [12:26] <@ericb2> svn diff . | patch -R -p0 187 : [12:27] <@ericb2> I'm sorry, but I'll have to stop for 15 to 20 minutes. 188 : [12:27] <@ericb2> So I ask you to prepare questions, experiment and so on for when I'll be back 189 : [12:27] <@ericb2> ok ? 190 : �01[12:27] <@fardad> thanks... 191 : �01[12:27] <@fardad> will do 192 : [12:28] <@ericb2> fardad: ok. See in later. and sorry again 193 : �01[12:28] <@fardad> thats very ok, this give us time to digest the info.... cu in 20 194 : [12:44] <@ericb2> Questions :-) 195 : [12:44] <@ericb2> ? 196 : [12:44] <arBraini> ericb2: wb 197 : �01[12:45] <@fardad> we are back too... 198 : [12:45] <l_zahir> I had problems applying a patch manually, could you please explain this 199 : [12:46] <l_zahir> the patch was : 200 : [12:46] <l_zahir> http://www.puppylinux.ca/puppyfiles/sources/kernel-2.6.25.11/patches-required.txt 201 : [12:47] <l_zahir> for this problem: 202 : [12:47] <l_zahir> http://www.puppylinux.ca/puppyfiles/sources/kernel-2.6.25.11/patches-required.txt 203 : [12:47] <l_zahir> sorry this: 204 : [12:47] <l_zahir> http://daeseonmoon.wordpress.com/2009/02/02/build-openoffice-phase-2-rhino-build-fail-with-openjdk/ 205 : [12:48] <@ericb2> l_zahir: this patch does have *extra* names in the path 206 : [12:49] <l_zahir> ok , I looked for the file and found them 207 : [12:49] <daeseon_> ericb2: so we need to use -p option 208 : [12:49] <@ericb2> l_zahir: so, what you have to do is 1) use -p option, with the right value AND apply the patch from the right place 209 : [12:49] <@ericb2> daeseon_: mandatory there 210 : [12:50] <l_zahir> is right place always one directory above the file? 211 : [12:50] <l_zahir> cause I noticed every body doing that 212 : [12:50] <l_zahir> <../ 213 : [12:51] <@ericb2> l_zahir: I think you can put the patch in rhino, and try to apply it directly, using -p0 214 : [12:51] <l_zahir> ok 215 : [12:51] <@ericb2> l_zahir: to be sure, I test with m40 216 : [12:51] <l_zahir> does the patch fail if the line numbers do not match the file? 217 : [12:52] <l_zahir> thanks 218 : [12:52] <l_zahir> cause the patch fails (half of it ) 219 : [12:52] <@ericb2> l_zahir: Please excuse me 220 : [12:53] <@ericb2> l_zahir: the patch must be applied using -p1 fomr inside rhino, and using -p0 from the root dir 221 : [12:53] <l_zahir> and I tried to apply it manually but the out come wouldn't make sense and laft me with open xml tags 222 : [12:53] <l_zahir> ok 223 : [12:53] <l_zahir> I did not use any -p 224 : [12:53] <@ericb2> l_zahir: in fact only -p0 from the root dir works 225 : [12:53] <@ericb2> l_zahir: and the patch gives garbage 226 : [12:53] <@ericb2> l_zahir: now to answer to your previosu question, a patch can cause disorder 227 : [12:53] <l_zahir> but the location of the code lines were wrong too 228 : [12:54] <l_zahir> ok 229 : [12:54] <@ericb2> l_zahir: yes, the patch does not apply, but I'll create a new one for you (if I can now) 230 : [12:54] <l_zahir> :) 231 : [12:54] <l_zahir> than you 232 : [12:54] <@ericb2> l_zahir: to summarize : 233 : [12:54] <@ericb2> patch --dry-run -p0 < buildfix-openjdk-6-no-rhino.diff 234 : [12:54] <@ericb2> is the right way to apply it 235 : [12:54] <@ericb2> but 236 : �01[12:55] <@fardad> ericb2: everyone is LOLing :) 237 : [12:55] <@ericb2> fardad: why ? 238 : [12:55] <mmu_man> our minister of culture looks nice on this pic: http://www.laquadrature.net/fr/hadopi-albanel-passe-son-oral-0-sur-20 239 : �01[12:55] <@fardad> ericb2: they are amazed that you can just fix the patch "right now" 240 : [12:55] <mmu_man> she likes DRM so probably doesn't like OOo :-( 241 : [12:56] <@ericb2> fardad: I'll try. This happens form time to time 242 : [12:56] <l_zahir> and I spent 3 days non stop and could not get it writ :( 243 : [12:56] <l_zahir> right 244 : [12:56] <@ericb2> two problems with this patch : 245 : [12:56] <@ericb2> patching file rhino/rhino1_5R5.patch 246 : [12:56] <@ericb2> Hunk #1 succeeded at 1206 (offset 32 lines). 247 : [12:56] <IZBot> no issue with number 1 248 : [12:56] <@ericb2> means on hunck will apply with "fuzz" , means will be applied, but cause the creation of file.orig 249 : [12:56] <IZBot> News from cws: hb17: nominated || fwk102: nominated || native226: nominated 250 : [12:57] <@ericb2> saying something not clean happened 251 : [12:57] <@ericb2> + the bad message : 252 : [12:57] <@ericb2> patching file scripting/java/build.xml 253 : [12:57] <@ericb2> Hunk #1 FAILED at 85. 254 : [12:57] <IZBot> no issue with number 1 255 : [12:57] <@ericb2> saying the result will be put in 256 : [12:57] <@ericb2> 1 out of 1 hunk FAILED -- saving rejects to file scripting/java/build.xml.rej 257 : [12:58] <@ericb2> to fix that, we need to apply it for true, and see what happened 258 : [12:58] <@ericb2> to the one who don't know how to proceed 259 : [12:59] <@ericb2> patches are created with the building environment 260 : [12:59] <l_zahir> the fixes to scripting/java/build.xml in the patch aws not clear for me 261 : [12:59] <@ericb2> e.g. on Mac OS X source MacOSXX86Env.Set.sh 262 : [12:59] <@ericb2> then, you have to go into rhino 263 : [12:59] <@ericb2> and type : 264 : [13:00] <@ericb2> dmake patch 265 : [13:01] <@ericb2> then, apply the changes you are supposed to apply in the new patch in the output tree -> unxmacxi.pro there 266 : [13:01] <@ericb2> (I'll continue after) 267 : [13:01] <@ericb2> then do : 268 : [13:01] <@ericb2> (once the changes are ok): : 269 : [13:01] <@ericb2> dmake create patch 270 : [13:01] <@ericb2> sorry 271 : [13:01] <@ericb2> dmake create_patch 272 : [13:01] <@ericb2> this command will create a new patch, replacing the previous one and including all the changes you did manually 273 : [13:01] <@ericb2> that's all 274 : [13:03] <@ericb2> l_zahir: now, maybe the change is obsolete, means cannot be applied. I'm not an .xml specialist, but I can have a look 275 : [13:03] <l_zahir> I would appreciate that 276 : [13:05] <l_zahir> So each successful Hunk means that 1 file has been modified? Or a part of a file? 277 : [13:05] <@ericb2> l_zahir: can be a part of a file, when several changes occur in the same file 278 : [13:05] <@ericb2> l_zahir: means it depends 279 : [13:05] <l_zahir> ok 280 : [13:06] <l_zahir> and after applying each patch should we dmake clean and build again? 281 : [13:06] <l_zahir> or we shoul apply all the patches from the beginning to the source code ? 282 : [13:06] <@ericb2> l_zahir: dmake create_patch will create a backup of the previous one ( .bak ) and build should be ok 283 : [13:07] <l_zahir> Ok , thanks 284 : [13:07] <@ericb2> l_zahir: no, so far, when you are inside a module, you just have to build it : build does it (supposing you sourced the environment file) 285 : [13:07] <@ericb2> l_zahir: deliver at the end, to put everything in the solver 286 : [13:07] <@ericb2> l_zahir and then you can continue the build 287 : [13:08] <@ericb2> l_zahir: back to this patch, the change look completely uncompatible 288 : [13:08] <l_zahir> yes but it worked for others 289 : [13:09] <@ericb2> l_zahir: interesting. Do you remember the milestone used for the build ? 290 : [13:09] <l_zahir> 40 and 41 291 : [13:10] <@ericb2> l_zahir: did the patch apply without garbage ? 292 : [13:10] <l_zahir> Daeseon did it manually 293 : �01[13:10] <@fardad> ericb2: intersting to know that for both build daeseon_ applied the patched manually :) 294 : [13:10] <l_zahir> but I couldn't 295 : [13:10] <l_zahir> He is the smartest here 296 : [13:11] <@ericb2> daeseon_: can yo please tell me more : did it break, then you applied the patch ? Or did you proceed differently ? 297 : [13:12] <daeseon_> ericb2:I saw the patch files and open the file which need to be changed using vi 298 : [13:12] <daeseon_> and then manuall I made change 299 : [13:12] <@ericb2> daeseon_: ok, then you fixed it manually 300 : [13:12] <@ericb2> daeseon_: that's the only solution I see 301 : [13:12] <daeseon_> ericb2:yes. I didn't know how to create patch file and 302 : [13:13] <@ericb2> daeseon_: ok, no problem 303 : [13:13] <daeseon_> how to apply patch using patch command 304 : [13:13] <daeseon_> Now I know... 305 : [13:13] <@ericb2> what I propose : I'll continue after with the patch and I'll finish the presentation. Still a little part to say 306 : [13:13] <@ericb2> ok ? 307 : [13:14] <l_zahir> Daeseon:good you did not know, otherwise you would be confused :) 308 : �01[13:14] <@fardad> ericb2: now that daeseon_ patched it and it worked, can't he diff the files and recreate the proper patch? 309 : �01[13:14] <@fardad> ericb2: sorry, please continue... 310 : [13:14] <@ericb2> fardad: yes, he can , but he'll have to backup the modified file, cleanup the tree, and restart dmake patch .. replace the modified files .. dmake create_patch 311 : [13:15] <@ericb2> fardad: thanks :) We suppose now we did a change, applied whatever patch 312 : [13:15] <@ericb2> Next part is : 313 : [13:15] <@ericb2> 4) Rebuild a module where a patch has been applied 314 : [13:15] <@ericb2> 4.1. Introduction 315 : [13:15] <@ericb2> We suppose we modified some files, and we need to rebuild a lib. The scheme is always the same, in every module concerned by the build 316 : [13:15] <@ericb2> - the first prj/build.lst does contain the modules dependencies, means all the listed modules are prerequisites 317 : [13:16] <@ericb2> - everything built inside a module is put in type_os_proc.pro 318 : [13:16] <@ericb2> e.g. on Mac OS X, type == unx , os == macx , I for Intel -> output dir is unxmacxi.pro in every module 319 : [13:17] <@ericb2> Note: have a look in solenv/inc -> all the possible arch/os have their own makefile, containing the essential for the build. unxlngi4.mk unxmacxi.mk unxmacxp.mk .. and so on : everything is there 320 : [13:17] <@ericb2> The last modification date is used to check the dependencies. 321 : [13:17] <@ericb2> Rule : If a .o is older than it's dependencies, it is rebuild 322 : [13:17] <@ericb2> -> once you modified a file ( touch file is enough) , build in a module will create a new lib 323 : [13:17] <@ericb2> or more generally, new binaries 324 : [13:18] <@ericb2> 4.2 ) Example : rebuild libvclmxi.dylib on Mac ( .so on Linux, .dll on Windows ) 325 : [13:18] <@ericb2> Hypothesis : we suppose the build is completed, and successfull. 326 : [13:18] <@ericb2> cd vcl 327 : [13:18] <@ericb2> touch aqua/source/gdi/sallayout.cxx 328 : [13:18] <@ericb2> -> even without a change, the matching .o will be rebuilt 329 : [13:19] <@ericb2> build 330 : [13:19] <@ericb2> ! not dmake inside a module 331 : [13:19] <@ericb2> but dmake can be used in a subdir containing a makefile.mk file 332 : [13:20] <@ericb2> e.g. dmake test will build whatever respecting the target "test" if there is one existing in the makefile.mk file located in the current dir 333 : [13:20] <@ericb2> Other tip : 334 : [13:20] <@ericb2> If you are in aqua/source/gdi , and you want to rebuild *only* the files listed in the makefile in the current dir, do : 335 : [13:20] <@ericb2> dmake killobj 336 : [13:20] <@ericb2> build 337 : [13:20] <@ericb2> Once done, and if you want to see the changes packaged, do : deliver 338 : [13:21] <@ericb2> cd ../instsetoo_native 339 : [13:21] <@ericb2> mv unxmacxi.pro 340 : [13:21] <@ericb2> unxmacxi.pro_back 341 : [13:21] <@ericb2> (in one line) 342 : [13:21] <@ericb2> build 343 : [13:21] <@ericb2> will recreate a new installset 344 : [13:21] <@ericb2> Else, if you just want to test your lib, put it in the right subdir 345 : [13:21] <@ericb2> (probably in <Install_dir>/OpenOffice.org.app/Contents/basis-link/program on Mac OS X ) 346 : [13:22] <@ericb2> same for any binary, or resource file ( .res ) when you modify the layout 347 : [13:22] <@ericb2> Now, we'll start the gdb part 348 : [13:22] <@ericb2> 5 ) Build including symbols. 349 : [13:22] <@ericb2> Example 350 : [13:22] <@ericb2> cd vcl 351 : [13:23] <@ericb2> mv unxmacxi.pro unxmacxi.pro_back # keep the normal build 352 : [13:23] <@ericb2> build debug="a_non_empty_sting" # means " build debug=t " is ok 353 : [13:23] <@ericb2> The final lib, including symbols for debugging, will be in unxmacxi.pro/lib (on Mac OS X ) 354 : [13:23] <@ericb2> Replace the one already in <Install_dir>/OpenOffice.org.app/Contents/basis-link/program on Mac OS X 355 : [13:23] <@ericb2> and the last thing for today (will prepare the next presentation) : 356 : [13:23] <@ericb2> To debug using gdb,do : 357 : [13:23] <@ericb2> cd <Install_dir>/OpenOffice.org.app/Contents/program 358 : [13:23] <@ericb2> gdb --args soffice apath/afile 359 : [13:23] <@ericb2> "r" (to start) .. and so on; 360 : [13:23] <@ericb2> Happy debugging ! 361 : [13:24] <@ericb2> Sorry for being long, but that's all for today :) 362 : [13:24] <tct13> hello everybody 363 : [13:24] <tct13> hello ericb2 364 : [13:24] <tct13> :-) 365 : [13:24] <@ericb2> tct13: hello 366 : [13:25] <l_zahir> Thanks 367 : [13:25] <tct13> i'm the romanian from fosdem that stated the implication of its organization in openoffice education 368 : [13:25] <Kamots> hello 369 : [13:25] <@ericb2> l_zahir: you're welcome 370 : [13:25] <Kamots> thank you very much eric 371 : [13:25] <@ericb2> tct13: hello :) 372 : [13:25] <tct13> :-) 373 : [13:25] <@ericb2> Kamots: you're welcome 374 : [13:25] <BartB> ericb2: where on the wiki will all of this be posted? 375 : [13:26] <@ericb2> @all : http://wiki.services.openoffice.org/wiki/Education_ClassRoom/Practice#SVN_use 376 : [13:26] <achan66> yey thanks 377 : [13:26] <achan66> i was gonna ask that 378 : [13:26] <@ericb2> I'll complete once possible 379 : [13:26] <@ericb2> this is not perfect, and everybody is welcome to improve, and add information ! 380 : [13:26] <@ericb2> thanks in advance 381 : [13:26] <@ericb2> :-) 382 : [13:27] <BartB> thank you 383 : [13:27] <daeseon_> thank you eric. It is really useful. 384 : [13:27] <@ericb2> l_zahir: I'll have a look at your patch 385 : [13:27] <@ericb2> daeseon_: you're welcome :) 386 : [13:27] <tct13> me and my associate continued the discussion with Sun officials. we plan a Sun event at the very beginning of the Campus Ambassador programme, at the end of February 387 : [13:27] <@ericb2> tct13: great. 388 : [13:27] <l_zahir> thank you , I'm looking forward to the result 389 : [13:27] <tct13> meanwhile, we document on ooo developing from education.ooo 390 : [13:27] <tct13> :-D 391 : [13:28] <@ericb2> l_zahir: just be a bit patient: it will be dinner time. But I'll be there afterwars 392 : [13:28] <@ericb2> afterwards 393 : [13:28] <l_zahir> :) 394 : [13:28] <l_zahir> thanks 395 : [13:28] <@ericb2> tct13: just to avoid misunderstanding: Sun does not provide me any information. Means does not really share ;) 396 : [13:28] <tct13> ericb2: just wanted to let you know, we'll probably ask some questions this days 397 : �01[13:29] <@fardad> ok, this ends the session for today, thanks again and see you on thursday same time :) 398 : [13:29] <tct13> well, this is why I told you :-) 399 : [13:29] <@ericb2> l_zahir: the probem you could have, is a working patch can be created, but can break the build 400 : [13:29] <@ericb2> tct13: thanks :) 401 : [13:29] <@ericb2> tct13: can we continue in say, 1h30 ? 402 : [13:29] <l_zahir> yes 403 : [13:29] <tct13> sure :-) 404 : [13:29] <@ericb2> tct13: I'm sorry, this is dinner time 405 : [13:29] <tct13> i already had 406 : [13:29] <@ericb2> tct13: ok, then later :) 407 : [13:29] <tct13> gmt + 2 :-P 408 : [13:29] <tct13> ok 409 : [13:30] <@ericb2> tct13: I'm sorry, but I really will have to stop 410 : [13:30] <tct13> bone a petit 411 : [13:30] <l_zahir> ericb2: have a good day 412 : [13:31] <Kamots> thanks again, take care everyone 413 : [13:31] <@ericb2> thanks to all :-)
Second Session
1 : [12:04] <@ericb2> ok, let's start ? 2 : �01[12:04] <@fardad> we are ready (missing 3 students, but its their loss) 3 : [12:04] <@ericb2> ok 4 : [12:04] <@ericb2> Outline of the ClassRoom 5 : [12:04] <@ericb2> Prerequisites for the test 6 : [12:04] <@ericb2> Reminder about what happens when building in a module 7 : [12:04] <@ericb2> Add symbols in a library 8 : [12:04] <@ericb2> Introduction of gdb use 9 : [12:04] <@ericb2> Launch OOo using gdb 10 : [12:05] <@ericb2> Play with it (discovery) 11 : [12:05] <@ericb2> So today, we'll start playing with gdb + Ooo 12 : [12:06] <@ericb2> who does have a full OOo build at hand ? 13 : [12:06] <@ericb2> ok :) 14 : [12:06] <@ericb2> As pre-requisites , I'll suppose : 15 : [12:06] <@ericb2> - there is a complete build working already 16 : [12:06] <@ericb2> - there is a working installset , and we will launch it using the terminal 17 : [12:06] <@ericb2> Thus, if you want to redo at home, or later, you just have to read and try 18 : [12:06] <@ericb2> Reminder : what happens when something is built 19 : [12:07] <@ericb2> we'll use <module> for whatever subdir of the OOo tree, aka "module" most of the time 20 : [12:08] <@ericb2> <module>/prj/build.lst does contain the list of the subdirs containing a makefile 21 : [12:08] <@ericb2> Means: Every product is built in the output dir. e.g. : unxmacxi.pro on Mac Intel 22 : [12:08] <@ericb2> we have the same tree inside all the modules: 23 : [12:08] <@ericb2> unxmacxi.pro/bin 24 : [12:08] <@ericb2> unxmacxi.pro/lib 25 : [12:08] <@ericb2> unxmacxi.pro/inc 26 : [12:09] <@ericb2> ... and so on (look yourself ) 27 : [12:09] <@ericb2> to rebuild a module, just remove this directory 28 : [12:09] <@ericb2> Once all the .o are build, the libs, and/or the binaries / resources / whatever are "delivered" from the unxmacxi.pro dir to the solver 29 : [12:11] <@ericb2> The information providing the list of what has to be delivered is always in : <module>/prj/d.lst 30 : [12:11] <@ericb2> these files are text files, using a "Windows" separator, but this is not a problem at all 31 : [12:13] <@ericb2> If we summarize : a normal build provides binaries like libraries, who are stripped when the are delivered. Between the unxmacxi.pro and their place in the "solver " 32 : [12:14] <@ericb2> Important: to be able to trace using gdb, we'll need to add symbols, lines of code and a lot of information inside the binaries 33 : [12:14] <@ericb2> Howto add symbols in a library ? 34 : [12:14] <@ericb2> 1) first approach 35 : [12:14] <@ericb2> -> look at configure extra option : --disable-strip-solver 36 : [12:15] <@ericb2> To verify by yourself, just place you at the root of the sources (since DEV300_m40, there is no longer config_office subdir) 37 : [12:15] <@ericb2> and do : ./configure --help | grep -4 solver 38 : [12:16] <@ericb2> you'll have several lines explaining the right option 39 : [12:16] <@ericb2> Tip : if you're familiar with configure, better read configure itself, more informative ;-) 40 : [12:17] <@ericb2> and if you know a bit of autoconf, you can even hack configure.in, and run autoconf to regenerate a new configure :) 41 : [12:18] <@ericb2> The first approach has a drawback : just a bit of information is inside the binary, and that's not enough most of the time, when you have a complex problem to solve 42 : [12:19] <@ericb2> 2) second approach 43 : [12:19] <@ericb2> consider only a part of the code, for tracing 44 : [12:20] <@ericb2> The method is equivalent to use --enable-debug at configure time, but nobody uses this option. the reason is simple : all libraries become huges, and OOo won't probably launch correctly. 45 : [12:21] <@ericb2> e.g. : the libsw (writer) becomes 660MB heavy 46 : �01[12:22] <@fardad> ericb2: when you say correctly, does it mean it will be too slow, or it will not function properly? 47 : [12:22] <Kamots> wow, that's a lot of extra weight 48 : [12:22] <@ericb2> fardad: yes, imagine 10 libs of 500MB every + some other 100MB and so on 49 : [12:23] <@ericb2> Kamots: I'll explain you how to proceed 50 : �01[12:23] <@fardad> wow, :o 51 : [12:24] <@ericb2> Other important information 52 : [12:24] <@ericb2> about assertions 53 : [12:24] <@ericb2> There is another option in configure 54 : [12:24] <@ericb2> --enable-dbgutil 55 : [12:25] <@ericb2> Include additional debugging utilities, such assertions, object counting, etc. Larger build. 56 : [12:25] <@ericb2> Independent from --enable-debug 57 : [12:25] <@ericb2> the *second one* does concern assertions in the code : 58 : [12:25] <@ericb2> DBG_ASSERT( !(rALR.flags & kATSGlyphInfoTerminatorGlyph), 59 : [12:25] <@ericb2> "ATSLayout::InitGIA(): terminator glyph not marked as deleted!" ); 60 : [12:25] <@ericb2> -> if the condition is not verified -> boom .. and a window will appear, containing the message 61 : [12:26] <@ericb2> if --enable-dbgutil is not in the configure command line, assertions are not included 62 : [12:26] <@ericb2> As you understood, assertions are for development, not for end users ;-) 63 : [12:27] <@ericb2> So, we use to add symbols for debugging for some libs, in a given module only 64 : [12:27] <@ericb2> Counterpart : needs to rebuild the module 65 : [12:27] <@ericb2> The process is very simple : 66 : [12:28] <@ericb2> cd <module> 67 : [12:28] <@ericb2> mv unxmacxi.pro unxmacxi.pro_backup 68 : [12:28] <@ericb2> build debug=t 69 : [12:28] <@ericb2> Do *always* a backup of your build, because the binaries in the output tree, do match with stamps in the solver 70 : [12:29] <@ericb2> if you modify something, you'll have to redo a build, and a "deliver". Elser, the build can break at postprocess, or at then end, because the stamp between the solver and the module do not match 71 : [12:29] <@ericb2> that's just harmless, but if you are not aware, you can lose a while before someone explains you what happens 72 : [12:30] <@ericb2> As example, I'll rebuild a little lib , to show you the difference 73 : [12:31] <@ericb2> cd apple_remote/ 74 : [12:31] <@ericb2> source ../MacOSXX86Env.Set.sh 75 : [12:31] <@ericb2> sorry, I forgot :-) 76 : [12:32] <@ericb2> mv unxmacxi.pro unxmacxi.pro_back 77 : [12:32] <@ericb2> build debug=t 78 : [12:32] <@ericb2> Important: whatever you put, will work 79 : [12:32] <@ericb2> t is one letter, but once the string is not empty, debug is true 80 : [12:33] <@ericb2> means all the code included between #ifdef DEBUG ... #endif or some other macros, will be included 81 : [12:34] <@ericb2> e.g. : 82 : [12:34] <@ericb2> #ifdef DEBUG 83 : [12:34] <@ericb2> // debug purpose 84 : [12:34] <@ericb2> NSLog(@"reset... (after listening to remote)"); 85 : [12:34] <@ericb2> #endif 86 : [12:34] <@ericb2> -> in the terminal, I'll see the information 87 : [12:34] <@ericb2> NSLog is sort of cout 88 : �01[12:35] <@fardad> ic, 89 : [12:35] <@ericb2> After the rebuild : 90 : [12:35] <@ericb2> ls -l unxmacxi.pro/lib/libAppleRemotemxi.dylib 91 : [12:35] <@ericb2> -rwxr-xr-x 1 ericb ericb 159932 Feb 19 18:31 unxmacxi.pro/lib/libAppleRemotemxi.dylib 92 : [12:35] <@ericb2> ls -l unxmacxi.pro_back/lib/libAppleRemotemxi.dylib 93 : [12:35] <@ericb2> -rwxr-xr-x 1 ericb ericb 52436 Feb 12 14:31 unxmacxi.pro_back/lib/libAppleRemotemxi.dylib 94 : [12:36] <@ericb2> the first one does contain strings and a lot of other stuff 95 : [12:37] <@ericb2> Now .. Launch OOo in a terminal :) 96 : [12:37] <@ericb2> before, we'll copy the lib in the bundle 97 : [12:37] <IZBot> News from cws: native227: created 98 : [12:38] <@ericb2> For the rest, my bundle is in the Desktop/test_eraser folder (I'm on Mac OS X ) 99 : [12:38] <@ericb2> Means, the Bundle is the dir : ~/Desktop/test_eraser/OpenOffice.org.app 100 : [12:38] <@ericb2> So, I'll open a terminal, and I'll do : 101 : [12:38] <@ericb2> cd ~/Desktop/test_eraser/OpenOffice.org.app/Contents/program 102 : [12:39] <@ericb2> the idea, is to start gdb form the directory containing soffice (the binary ) 103 : [12:39] <@ericb2> and the command line is : 104 : [12:40] <@ericb2> gdb --args ~/Desktop/est.odp 105 : [12:40] <@ericb2> you'll see gdb tell you a lot of things. If you don't want to see that the next time, you can add -q (for quiet) option 106 : [12:41] <@ericb2> as you can see nothing happens :) 107 : [12:41] <@ericb2> the reason is: the binary is not "running" 108 : [12:42] <@ericb2> oops, sorry 109 : [12:42] <@ericb2> gdb --args soffice ~/Desktop/est.odp 110 : [12:42] <@ericb2> is the right command line 111 : [12:42] <@ericb2> to redo; just enter "q" 112 : [12:42] <@ericb2> and type the correct command 113 : [12:42] <@ericb2> now, type r ( shortcut for "run" ) 114 : [12:43] <@ericb2> -> OOo will start 115 : [12:43] <@ericb2> and open the file 116 : [12:43] <@ericb2> in the terminal, you no longer have the control. To stop the execution, do "CTRL-C" 117 : [12:44] <@ericb2> Program received signal SIGINT, Interrupt. 118 : [12:44] <@ericb2> 0x90009cd7 in mach_msg_trap () 119 : [12:44] <@ericb2> (gdb) 120 : [12:44] <@ericb2> OOo is stopped 121 : [12:44] <@ericb2> you can enter whatever command, like " info frame " 122 : [12:44] <@ericb2> to continue, type : c 123 : [12:45] <@ericb2> The result is : (gdb) c 124 : [12:45] <@ericb2> Continuing. 125 : [12:45] <@ericb2> and OOo is no longer stopped 126 : [12:45] <@ericb2> Add a breakpoint 127 : �01[12:45] <@fardad> amazing... 128 : [12:46] <@ericb2> fardad: I know this is difficult like that, but people will redo later, and ask whenever they want 129 : [12:46] <@ericb2> on the channel 130 : [12:46] <@ericb2> we'll explain them 131 : �01[12:46] <@fardad> I understand 132 : [12:46] <@ericb2> Let's add a breakpoint now 133 : [12:47] <@ericb2> to know whether breakpoints are set or not, the command is : 134 : [12:47] <@ericb2> info b 135 : [12:47] <@ericb2> (means info breakpoints) 136 : [12:47] <@ericb2> exactly : 137 : [12:47] <@ericb2> CTRL-C 138 : [12:47] <@ericb2> info b 139 : [12:48] <@ericb2> The result is : 140 : [12:48] <@ericb2> (gdb) info b 141 : [12:48] <@ericb2> No breakpoints or watchpoints. 142 : [12:48] <@ericb2> of course 143 : [12:48] <@ericb2> so let's set one 144 : [12:49] <@ericb2> Since only libAppleRemotemxi.dylib has symbols, I'll have to set one in whatever file included 145 : �01[12:52] <@fardad> oops 146 : �01[12:54] <@fardad> we lost eric! 147 : [12:54] <@ericb2> For instance : 148 : [12:54] <@ericb2> (gdb) l 149 : [12:54] <@ericb2> 113 #ifdef DEBUG 150 : [12:54] <@ericb2> 114 NSString* buttonName = nil; 151 : [12:54] <@ericb2> 115 #endif 152 : [12:54] <@ericb2> 116 if (pressedDown) 153 : [12:55] <@ericb2> 117 { 154 : [12:55] <@ericb2> 118 pressed = @"(pressed)"; 155 : [12:55] <@ericb2> 119 156 : [12:55] <@ericb2> 120 #ifdef DEBUG 157 : [12:55] <@ericb2> 121 switch(buttonIdentifier) 158 : [12:55] <@ericb2> 122 { 159 : [12:55] <@ericb2> Current language: auto; currently objective-c 160 : [12:55] <@ericb2> (gdb) 161 : [12:55] <@ericb2> I can go up or continue 162 : [12:55] <@ericb2> and if I need info, I can check for the stack of frames 163 : [12:55] <@ericb2> (gdb) bt 164 : [12:56] <@ericb2> -> will return the frames, in *reverse* order. Means, the #0 is the last one, and #1 the one before .. and so on 165 : [12:56] <IZBot> no issue with number 1 166 : [12:56] <@ericb2> ooops :-) 167 : [12:56] <@ericb2> Lets choose "n" for next 168 : [12:57] <@ericb2> The result is : 169 : [12:57] <@ericb2> (gdb) n 170 : [12:57] <@ericb2> 121 switch(buttonIdentifier) 171 : [12:57] <@ericb2> IMPORTANT: the current line is NOT executed yet 172 : [12:57] <@ericb2> e.g. if you have a= 10; 173 : [12:57] <@ericb2> p a 174 : [12:57] <@ericb2> can return whatevert 175 : [12:58] <@ericb2> *only* n will validate the line. This is the context 176 : [12:58] <@ericb2> execution context 177 : [12:58] <@ericb2> n will continue .. 178 : [12:58] <@ericb2> (gdb) n 179 : [12:58] <@ericb2> 126 case kRemoteButtonPlay: buttonName = @"Play"; break; // MEDIA_COMMAND_PLAY 180 : [12:58] <@ericb2> and of course, we can check for the variable : 181 : [12:58] <@ericb2> (gdb) p buttonIdentifier 182 : [12:58] <@ericb2> $1 = kRemoteButtonPlay 183 : [12:59] <@ericb2> so, it means the slideshow will start ... 184 : [13:00] <@ericb2> Next instruction : 185 : [13:00] <@ericb2> (gdb) n 186 : [13:00] <@ericb2> 140 [ self postTheEvent:buttonIdentifier modifierFlags: 0 ]; 187 : [13:00] <@ericb2> -> means the remote sent a "Play" and I'll inform the vcl there is an event, containing the "Play" information. vcl will forward to Impress, and the slideshow will start 188 : [13:01] <@ericb2> This is only the introduction (if people are intersted, we can do another workshop about gdb another day ) 189 : [13:02] <@ericb2> To quit *cleanly* 190 : [13:02] <@ericb2> delete the brekapoints : 191 : [13:02] <@ericb2> d 192 : [13:02] <@ericb2> confirm with yest 193 : [13:02] <@ericb2> yes 194 : [13:02] <@ericb2> c 195 : [13:02] <@ericb2> to continue 196 : [13:02] <@ericb2> and then Quit OOo using CMD Q 197 : [13:03] <@ericb2> The result is : 198 : [13:03] <@ericb2> Program exited normally. 199 : [13:03] <@ericb2> (gdb) 200 : [13:03] <@ericb2> Then quit gdb : 201 : [13:03] <@ericb2> q 202 : [13:03] <@ericb2> -> will give you the normal prompt 203 : [13:03] <@ericb2> back 204 : [13:03] <@ericb2> Questions ? 205 : [13:04] <BartB> not at the moment, might have some later 206 : [13:04] <@ericb2> I forgot, to affect a value, the command is "set" 207 : [13:04] <@ericb2> e.g. : 208 : [13:04] <MrBraini> ericb2: last lecture you stated the notes from the lectures will be placed on the wiki? where can we find the notes in the wiki? 209 : [13:04] <@ericb2> (gdb) : set a=10 210 : [13:05] <daeseon_> not now may be later. 211 : [13:05] <@ericb2> MrBraini: I'll put them on the wiki, yes 212 : [13:05] <l_zahir> is there a y way so we can see multiple line before their execution? 213 : [13:05] <@ericb2> l_zahir: list ? 214 : [13:05] <@ericb2> l_zahir: l is the shortcut 215 : [13:06] <@ericb2> l_zahir: I forgot, there is another way to break, using conditional breakpoint 216 : [13:06] <l_zahir> oksu during debugging or before? 217 : [13:06] <@ericb2> l_zahir : you can go up and down in the frames 218 : [13:06] <@ericb2> l_zahir to retrieve a context 219 : [13:06] <l_zahir> ok , thanks 220 : [13:07] <@ericb2> l_zahir: I think, the best is to redo a workshop, with everything ready 221 : [13:07] <@ericb2> l_zahir: but nothing will replace the experiences 222 : [13:07] <l_zahir> sure 223 : [13:07] <l_zahir> I will 224 : [13:07] <@ericb2> l_zahir: no problem. 225 : [13:08] <@ericb2> BTW, I provided a patch for rhino and scripting 226 : [13:08] <l_zahir> Oh, good :) 227 : [13:08] <@ericb2> was my fault: two modules where concerned, and this is what caused some issues 228 : [13:08] <@ericb2> l_zahir: one minute, I'll retrive the URL 229 : [13:08] <l_zahir> thanks 230 : [13:08] <l_zahir> :) 231 : [13:09] <@ericb2> http://eric.bachard.free.fr/mac/aquavcl/patches/aqua_February2009/17th_february/complete_rhino_and_scripting_patch.diff 232 : [13:09] <@ericb2> l_zahir: this patch should apply cleanly on m40 233 : [13:09] <@ericb2> l_zahir: not sure it will work, I'm not a Java specialist ;) 234 : [13:09] <@ericb2> ok, I'll have to stop. 235 : [13:09] <l_zahir> I'll try 236 : [13:10] <@ericb2> If you have further questions, ask directly, and if I see them, I'll answer 237 : [13:11] <l_zahir> sure 238 : [13:11] <@ericb2> Other questions ? 239 : [13:12] <@ericb2> If you have no other questions, I'll stop for a while, but in ~2 hours max, I'll be back. 240 : [13:12] <@ericb2> The content of the classroom will be on the wiki 241 : [13:12] <achan66> okay 242 : [13:12] <daeseon_> ok. 243 : [13:12] <@ericb2> later 244 : [13:12] <l_zahir> no Qs 245 : [13:12] <MrBraini> okay thank you 246 : [13:12] <rmwang> Okay Thank you Eric! 247 : [13:13] <@ericb2> thansk to all for coming :) 248 : [13:13] <BartB> thank you Eric 249 : [13:13] <achan66> eric, would it be here? 250 : [13:13] <achan66> http://wiki.services.openoffice.org/wiki/Education_ClassRoom/Practice#SVN_use 251 : [13:13] <@ericb2> achan66: yes, not far 252 : [13:13] <achan66> thank you 253 : [13:13] <WFred___> Thanks Eric! 254 : [13:13] <achan66> = ) 255 : [13:13] <@ericb2> achan66: just a tip : look at recent changes on the wiki, say in 2 or 3 hours ;-) 256 : [13:14] <achan66> affirm 257 : [13:14] <MrBraini> okay 258 : [13:14] <Kamots> thank you Eric 259 : [13:15] <daeseon_> thanks Eric 260 : �01[13:19] <@fardad> thanks eric