/[ddp]/manuals/trunk/quick-reference/asciidoc/12_program.txt
ViewVC logotype

Contents of /manuals/trunk/quick-reference/asciidoc/12_program.txt

Parent Directory Parent Directory | Revision Log Revision Log


Revision 6872 - (show annotations) (download)
Sat Aug 22 05:41:18 2009 UTC (3 years, 9 months ago) by osamu
File MIME type: text/plain
File size: 39778 byte(s)
removed future tence
1 == Programming
2
3 // vim: set sts=2 expandtab:
4 // Use ":set nowrap" to edit table
5
6 I provide some pointers for people to learn programming on the Debian system enough to trace the packaged source code. Here are notable packages and corresponding documentation packages for programing.
7
8 .List of packages to help programing
9 [grid="all"]
10 `-----------------`-------------`------------`------------------------------------------------------------------------
11 package popcon size documentation
12 ----------------------------------------------------------------------------------------------------------------------
13 `autoconf` @-@popcon1@-@ @-@psize1@-@ "`info autoconf`" provided by `autoconf-doc`
14 `automake` @-@popcon1@-@ @-@psize1@-@ "`info automake`" provided by `automake1.10-doc`
15 `bash` @-@popcon1@-@ @-@psize1@-@ "`info bash`" provided by `bash-doc`
16 `bison` @-@popcon1@-@ @-@psize1@-@ "`info bison`" provided by `bison-doc`
17 `cpp` @-@popcon1@-@ @-@psize1@-@ "`info cpp`" provided by `cpp-doc`
18 `ddd` @-@popcon1@-@ @-@psize1@-@ "`info ddd`" provided by `ddd-doc`
19 `exuberant-ctags` @-@popcon1@-@ @-@psize1@-@ `exuberant-ctags`(1)
20 `flex` @-@popcon1@-@ @-@psize1@-@ "`info flex`" provided by `flex-doc`
21 `gawk` @-@popcon1@-@ @-@psize1@-@ "`info gawk`" provided by `gawk-doc`
22 `gcc` @-@popcon1@-@ @-@psize1@-@ "`info gcc`" provided by `gcc-doc`
23 `gdb` @-@popcon1@-@ @-@psize1@-@ "`info gdb`" provided by `gdb-doc`
24 `gettext` @-@popcon1@-@ @-@psize1@-@ "`info gettext`" provided by `gettext-doc`
25 `gfortran` @-@popcon1@-@ @-@psize1@-@ "`info gfortran`" provided by `gfortran-doc`
26 `glade` @-@popcon1@-@ @-@psize1@-@ help provided via menu
27 `glade-gnome` @-@popcon1@-@ @-@psize1@-@ help provided via menu
28 `libc6` @-@popcon1@-@ @-@psize1@-@ "`info libc`" provided by `glibc-doc` and `glibc-doc-reference`
29 `make` @-@popcon1@-@ @-@psize1@-@ "`info make`" provided by `make-doc`
30 `mawk` @-@popcon1@-@ @-@psize1@-@ `mawk`(1)
31 `perl` @-@popcon1@-@ @-@psize1@-@ `perl`(1) and html pages provided by `perl-doc` and `perl-doc-html`
32 `python` @-@popcon1@-@ @-@psize1@-@ `python`(1) and html pages provided by `python-doc`
33 `tcl8.4` @-@popcon1@-@ @-@psize1@-@ `tcl`(3) and detail manual pages provided by `tcl8.4-doc`
34 `tk8.4` @-@popcon1@-@ @-@psize1@-@ `tk`(3) and detail manual pages provided by `tk8.4-doc`
35 `ruby` @-@popcon1@-@ @-@psize1@-@ `ruby`(1) and interactive reference provided by `ri`
36 `vim` @-@popcon1@-@ @-@psize1@-@ help(F1) menu provided by `vim-doc`
37 `susv2` @-@popcon1@-@ @-@psize1@-@ fetch "http://www.unix.org/version2/[The Single Unix Specifications v2]"
38 `susv3` @-@popcon1@-@ @-@psize1@-@ fetch "http://www.unix.org/version3/[The Single Unix Specifications v3]"
39 ----------------------------------------------------------------------------------------------------------------------
40
41 Online references are available by typing "`man name`" after installing `manpages` and `manpages-dev` packages. Online references for the GNU tools are available by typing "`info program_name`" after installing the pertinent documentation packages. You may need to include the `contrib` and `non-free` archives in addition to the `main` archive since some GFDL documentations are not considered to be DSFG compliant.
42
43 WARNING: Do not use "`test`" as the name of an executable test file. "`test`" is a shell builtin.
44
45 CAUTION: You should install software programs directly compiled from source into "`/usr/local`" or "`/opt`" to avoid collision with system programs.
46
47 TIP: http://www.99-bottles-of-beer.net/[Code examples of creating "Song 99 Bottles of Beer"] should give you good idea of practically all the programming languages.
48
49 === The shell script
50
51 The http://en.wikipedia.org/wiki/Shell_script[shell script] is a text file with the execution bit set and contains the commands in the following format.
52
53 --------------------
54 #!/bin/sh
55 ... command lines
56 --------------------
57 The first line specifies the shell interpreter which read and execute this file contents.
58
59 Reading shell scripts is the **best** way to understand how a Unix-like system works. Here, I give some pointers and reminders for shell programming. See "Shell Mistakes" (http://www.greenend.org.uk/rjk/2001/04/shell.html) to learn from mistakes.
60
61 Unlike shell interactive mode (see <<_the_simple_shell_command>> and <<_unix_like_text_processing>>), shell scipts frequently use parameters, conditionals, and loops.
62
63 ==== POSIX shell compatibility
64
65 Many system scripts may be interpreted by any one of http://en.wikipedia.org/wiki/POSIX[POSIX] shells (see <<list-of-shell-programs>>). The default shell for the system is "`/bin/sh`" which is a symlink pointing to the actual program.
66
67 - `bash`(1) for `lenny` or older
68 - `dash`(1) for `squeeze` or newer
69
70 Avoid writing a shell script with **bashisms** or **zshisms** to make it portable among all POSIX shells. You can check it using `checkbashisms`(1).
71
72 .List of typical bashisms
73 [grid="all"]
74 `-----------------------------------`------------------------------------
75 Good: POSIX Avoid: bashism
76 -------------------------------------------------------------------------
77 `if [ "$foo" = "$bar" ] ; then ...` `if [ "$foo" == "$bar" ] ; then ...`
78 `diff -u file.c.orig file.c` `diff -u file.c{.orig,}`
79 `mkdir /foobar /foobaz` `mkdir /foo{bar,baz}`
80 octal format: "`\377`" hexadecimal format: "`\xff`"
81 -------------------------------------------------------------------------
82
83 The "`echo`" command must be used with following cares since its implementation differs among shell builtin and external commands.
84
85 - Avoid using command option "`-e`" and "`-E`".
86 - Avoid using any command options except "`-n`".
87 - Avoid using escape sequences in the string since their handling varies.
88
89 NOTE: Although "`-n` option is **not** really POSIX syntax, it is generally accepted.
90
91 TIP: Use the "`printf`" command instead of the "`echo`" command if you need to embed escape sequences in the output string.
92
93 ==== Shell parameters
94
95 Special shell parameters are frequently used in the shell script.
96
97 .List of shell parameters
98 [grid="all"]
99 `---------------`-------------------------------------------
100 shell parameter value
101 ------------------------------------------------------------
102 `$0` name of the shell or shell script
103 `$1` first(1) shell argument
104 `$9` ninth(9) shell argument
105 `$#` number of positional parameters
106 `"$\*"` `"$1 $2 $3 $4 ... "`
107 `"$@"` `"$1" "$2" "$3" "$4" ...`
108 `$?` exit status of the most recent command
109 `$$` PID of this shell script
110 `$!` PID of most recently started background job
111 ------------------------------------------------------------
112
113 Basic **parameter expansions** to remember are followings.
114
115
116 .List of shell parameter expansions
117 [grid="all"]
118 `-------------------------`---------------------`---------------------------------------------------
119 parameter expression form value if `var` is set value if `var` is not set
120 ----------------------------------------------------------------------------------------------------
121 `$\{var:-string\}` "`$var`" "`string`"
122 `$\{var:+string\}` "`string`" "`null`"
123 `$\{var:=string\}` "`$var`" "`string`" (and run "`var=string`")
124 `$\{var:?string\}` "`$var`" echo "`string`" to **stderr** (and exit with error)
125 ----------------------------------------------------------------------------------------------------
126
127 Here, the colon "`:`" in all of these operators is actually optional.
128
129 - **with** "`:`" = operator test for **exist** and **not null**
130 - **without** "`:`" = operator test for **exist** only
131
132
133 .List of key shell parameter substitutions
134 [grid="all"]
135 `---------------------------`------------------------------
136 parameter substitution form result
137 -----------------------------------------------------------
138 `$\{var%suffix\}` remove smallest suffix pattern
139 `$\{var%%suffix\}` remove largest suffix pattern
140 `$\{var#prefix\}` remove smallest prefix pattern
141 `$\{var##prefix\}` remove largest prefix pattern
142 -----------------------------------------------------------
143
144 ==== Shell conditionals
145
146 Each command returns an **exit status** which can be used for conditional expressions.
147
148 - Success: 0 ("True")
149 - Error: non 0 ("False")
150
151 NOTE: "0" in the shell conditional context means "True", while "0" in the C conditional context means "False".
152
153 NOTE: "`[`" is the equivalent of the `test` command, which evaluates its arguments up to "`]`" as a conditional expression.
154
155 Basic **conditional idioms** to remember are foolowings.
156
157 - "`<command> && <if_success_run_this_command_too> || true`"
158 - "`<command> || <if_not_success_run_this_command_too> || true`"
159 - A multi-line script snippet as the following
160
161 --------------------
162 if [ <conditional_expression> ]; then
163 <if_success_run_this_command>
164 else
165 <if_not_success_run_this_command>
166 fi
167 --------------------
168
169 Here trailing "`|| true`" was needed to ensure this shell script does not exit at this line accidentally when shell is invoked with "`-e`" flag.
170
171 .List of file comparison operators in the conditional expression
172 [grid="all"]
173 `-----------------------`------------------------------------------------------
174 equation condition to return logical true
175 -------------------------------------------------------------------------------
176 ` -e <file> ` <file> exists
177 ` -d <file> ` <file> exists and is a directory
178 ` -f <file> ` <file> exists and is a regular file
179 ` -w <file> ` <file> exists and is writable
180 ` -x <file> ` <file> exists and is executable
181 ` <file1> -nt <file2> ` <file1> is newer than <file2> (modification)
182 ` <file1> -ot <file2> ` <file1> is older than <file2> (modification)
183 ` <file1> -ef <file2> ` <file1> and <file2> are on the same device and the same inode number
184 -------------------------------------------------------------------------------
185
186 .List of string comparison operators in the conditional expression
187 [grid="all"]
188 `--------------------`------------------------------------------------------
189 equation condition to return logical true
190 ----------------------------------------------------------------------------
191 ` -z <str> ` the length of <str> is zero
192 ` -n <str> ` the length of <str> is non-zero
193 ` <str1> = <str2> ` <str1> and <str2> are equal
194 ` <str1> != <str2> ` <str1> and <str2> are not equal
195 ` <str1> < <str2> ` <str1> sorts before <str2> (locale dependent)
196 ` <str1> > <str2> ` <str1> sorts after <str2> (locale dependent)
197 ----------------------------------------------------------------------------
198
199 **Arithmetic** integer comparison operators in the conditional expression are "`-eq`", "`-ne`", "`-lt`", "`-le`", "`-gt`", and "`-ge`".
200
201 ==== Shell loops
202
203 There are several loop idioms to use in POSIX shell.
204
205 - "`for x in foo1 foo2 ... ; do command ; done`" loops by assigning items from the list "`foo1 foo2 ...`" to variable "`x`" and executing "`command`".
206 - "`while condition ; do command ; done`" repeats "`command`" while "`condition`" is true.
207 - "`until condition ; do command ; done`" repeats "`command`" while "`condition`" is not true.
208 - "`break`" enables to exit from the loop.
209 - "`continue`" enables to resume the next iteration of the loop.
210
211 TIP: The http://en.wikipedia.org/wiki/C_(programming_language)[C]-language like numeric iteration can be realized by using `seq`(1) as the "`foo1 foo2 ...`" generator.
212
213 TIP: See <<_repeating_a_command_looping_over_files>>.
214
215 ==== The shell command-line processing sequence
216
217 The shell processes a script roughly as the following sequence.
218
219 // following bash manpage (but reserved word are picked from common ones with dash
220
221 - The shell reads a line.
222 - The shell groups a part of the line as **one token** if it is within `"…"` or `\'…\'`.
223 - The shell splits other part of a line into **tokens** by the following.
224 * Whitespaces: `<space> <tab> <newline>`
225 * Metacharacters: `< > | ; & ( )`
226 - The shell checks the **reserved word** and for each token to adjust its behavior if not within `"..."` or `\'...\'`.
227 * **reserved word**: `if then elif else fi for in while unless do done case esac`
228 - The shell expands **alias** if not within `"..."` or `\'...\'`.
229 - The shell expands **tilde** if not within `"..."` or `\'...\'`.
230 * "`\~`" -> current user@@@sq@@@s home directory
231 * "`\~<user>`" -> `<user>`@@@sq@@@s home directory
232 - The shell expands **parameter** to its value if not within `\'...\'`.
233 * **parameter**: "`$PARAMETER`" or "`${PARAMETER}`"
234 - The shell expands **command substitution** if not within `\'...\'`.
235 * "`$( command )`" -> the output of "`command`"
236 * "`@@@grave@@@ command @@@grave@@@`" -> the output of "`command`"
237 - The shell expands **pathname** glob to matching file names if not within `"..."` or `\'...\'`.
238 * `\*` -> any characters
239 * `?` -> one character
240 * `[...]` -> any one of the characters in "`...`"
241 - The shell looks up **command** from the following and execute it.
242 * **function** definition
243 * **builtin** command
244 * **executable file** in "`$PATH`"
245 - The shell goes to the next line and repeats this process again from the top of this sequence.
246
247 Single quotes within double quotes have no effect.
248
249 Executing "`set -x`" in the shell or invoking the shell with "`-x`" option make the shell to print all of commands executed. This is quite handy for debugging.
250
251 ==== Utility programs for shell script
252
253 In order to make your shell program as portable as possible across Debian system, it is good idea to limit utility programs to ones provided by **essential** packages.
254
255 - "`aptitude search \~E`" lists **essential** packages.
256 - "`dpkg -L <package_name> |grep \'/man/man.\*/\'`" lists manpages for commands offered by `<package_name>` package.
257
258 .List of packages containing small utility programs for shell scripts
259 [grid="all"]
260 `--------------`-------------`------------`----------------------------------------------
261 package popcon size description
262 -----------------------------------------------------------------------------------------
263 `coreutils` @-@popcon1@-@ @-@psize1@-@ GNU core utilities
264 `debianutils` @-@popcon1@-@ @-@psize1@-@ miscellaneous utilities specific to Debian
265 `bsdmainutils` @-@popcon1@-@ @-@psize1@-@ collection of more utilities from FreeBSD
266 `bsdutils` @-@popcon1@-@ @-@psize1@-@ basic utilities from 4.4BSD-Lite
267 `moreutils` @-@popcon1@-@ @-@psize1@-@ additional unix utilities
268 ------------------------------------------------------------------------------------------
269
270 TIP: Although `moreutils` may not exist ouside of Debian, it offers interesting small programs. Most notable one is `sponge`(8). See <<_global_substitution_with_regular_expressions>>.
271
272 ==== Shell script dialog
273
274 The user interface of a simple shell program can be improved from dull interaction by `echo` and `read` commands to more interactive one by using one of the so-called dialog program etc.
275
276 .List of user interface programs
277 [grid="all"]
278 `-----------`-------------`------------`-----------------------------------------------------------------------------------
279 package popcon size description
280 ---------------------------------------------------------------------------------------------------------------------------
281 `x11-utils` @-@popcon1@-@ @-@psize1@-@ `xmessage`(1): display a message or query in a window (X)
282 `whiptail` @-@popcon1@-@ @-@psize1@-@ displays user-friendly dialog boxes from shell scripts (newt)
283 `dialog` @-@popcon1@-@ @-@psize1@-@ displays user-friendly dialog boxes from shell scripts (ncurses)
284 `zenity` @-@popcon1@-@ @-@psize1@-@ display graphical dialog boxes from shell scripts (gtk2.0)
285 `gtkdialog` @-@popcon1@-@ @-@psize1@-@ GUI-creation command-line utility based on GTK+ library (gtk2.0+glade2)
286 `ssft` @-@popcon1@-@ @-@psize1@-@ Shell Scripts Frontend Tool (wrapper for zenity, kdialog, and dialog with gettext)
287 `gettext` @-@popcon1@-@ @-@psize1@-@ "`/usr/bin/gettext.sh`": translate message
288 ---------------------------------------------------------------------------------------------------------------------------
289
290 // || {{{xbase-clients}}} || 29862 || - || The {{{xmessage}}}(1) displays a message or query in a window (X)({{{etch}}}) ||
291
292 ==== Shell script example with zenity
293
294 Here is a simple script which creates ISO image with RS02 data supplemented by `dvdisaster`(1).
295
296 --------------------
297 #!/bin/sh -e
298 # gmkrs02 : Copyright (C) 2007 Osamu Aoki <osamu@debian.org>, Public Domain
299 #set -x
300 error_exit()
301 {
302 echo "$1" >&2
303 exit 1
304 }
305 # Initialize variables
306 DATA_ISO="$HOME/Desktop/iso-$$.img"
307 LABEL=$(date +%Y%m%d-%H%M%S-%Z)
308 if [ $# != 0 ] && [ -d "$1" ]; then
309 DATA_SRC="$1"
310 else
311 # Select directory for creating ISO image from folder on desktop
312 DATA_SRC=$(zenity --file-selection --directory \
313 --title="Select the directory tree root to create ISO image") \
314 || error_exit "Exit on directory selection"
315 fi
316 # Check size of archive
317 xterm -T "Check size $DATA_SRC" -e du -s $DATA_SRC/*
318 SIZE=$(($(du -s $DATA_SRC | awk '{print $1}')/1024))
319 if [ $SIZE -le 520 ] ; then
320 zenity --info --title="Dvdisaster RS02" --width 640 --height 400 \
321 --text="The data size is good for CD backup:\\n $SIZE MB"
322 elif [ $SIZE -le 3500 ]; then
323 zenity --info --title="Dvdisaster RS02" --width 640 --height 400 \
324 --text="The data size is good for DVD backup :\\n $SIZE MB"
325 else
326 zenity --info --title="Dvdisaster RS02" --width 640 --height 400 \
327 --text="The data size is too big to backup : $SIZE MB"
328 error_exit "The data size is too big to backup :\\n $SIZE MB"
329 fi
330 # only xterm is sure to have working -e option
331 # Create raw ISO image
332 rm -f "$DATA_ISO" || true
333 xterm -T "genisoimage $DATA_ISO" \
334 -e genisoimage -r -J -V "$LABEL" -o "$DATA_ISO" "$DATA_SRC"
335 # Create RS02 supplemental redundancy
336 xterm -T "dvdisaster $DATA_ISO" -e dvdisaster -i "$DATA_ISO" -mRS02 -c
337 zenity --info --title="Dvdisaster RS02" --width 640 --height 400 \
338 --text="ISO/RS02 data ($SIZE MB) \\n created at: $DATA_ISO"
339 # EOF
340 --------------------
341
342 You may wish to create launcher on the desktop with command set something like "`/usr/local/bin/gmkrs02 %d`".
343
344 === Make
345
346 http://en.wikipedia.org/wiki/Make_(software)[Make] is a utility to maintain groups of programs. Upon execution of `make`(1), `make` read the rule file, "`Makefile`", and updates a target if it depends on prerequisite files that have been modified since the target was last modified, or if the target does not exist. The execution of these updates may occur concurrently.
347
348 The rule file syntax is the following.
349
350 --------------------
351 target: [ prerequisites ... ]
352 [TAB] command1
353 [TAB] -command2 # ignore errors
354 [TAB] @command3 # suppress echoing
355 --------------------
356
357 Here "` [TAB] `" is a TAB code. Each line is interpreted by the shell after make variable substitution. Use "`\`" at the end of a line to continue the script. Use "`$$`" to enter "`$`" for environment values for a shell script.
358
359 Implicit rules for the target and prerequisites can be written, for example, by the following.
360
361 --------------------
362 %.o: %.c header.h
363 --------------------
364
365 Here, the target contains the character "`%`" (exactly one of them). The "`%`" can match any nonempty substring in the actual target filenames. The prerequisites likewise use "`%`" to show how their names relate to the actual target name.
366
367 .List of make automatic variables
368 [grid="all"]
369 `------------------`----------------------------------------
370 automatic variable value
371 ------------------------------------------------------------
372 `$@` target
373 `$<` first prerequisite
374 `$?` all newer prerequisites
375 `$\^` all prerequisites
376 `$\*` "`%`" matched stem in the target pattern
377 ------------------------------------------------------------
378
379 .List of make variable expansions
380 [grid="all"]
381 `------------------`-------------------
382 variable expansion description
383 ---------------------------------------
384 `foo1 := bar` one-time expansion
385 `foo2 = bar` recursive expansion
386 `foo3 += bar` append
387 ---------------------------------------
388
389 Run "`make -p -f/dev/null`" to see automatic internal rules.
390
391 === C
392
393 You can set up proper environment to compile programs written in the http://en.wikipedia.org/wiki/C_(programming_language)[C programming language] by the following.
394
395 --------------------
396 # aptitude install glibc-doc manpages-dev libc6-dev gcc build-essential
397 --------------------
398
399 The `libc6-dev` package, i.e., GNU C Library, provides http://en.wikipedia.org/wiki/C_standard_library[C standard library] which is collection of header files and library routines used by the C programming language.
400
401 See references for C as the following.
402
403 - "`info libc`" (C library function reference)
404 - `gcc`(1) and "`info gcc`"
405 - `each_C_library_function_name`(3)
406 - Kernighan &amp; Ritchie, "The C Programming Language", 2nd edition (Prentice Hall)
407
408 ==== Simple C program (gcc)
409
410 A simple example "`example.c`" can compiled with a library "`libm`" into an executable "`run_example`" by the following.
411
412 --------------------
413 $ cat > example.c << EOF
414 #include <stdio.h>
415 #include <math.h>
416 #include <string.h>
417
418 int main(int argc, char **argv, char **envp){
419 double x;
420 char y[11];
421 x=sqrt(argc+7.5);
422 strncpy(y, argv[0], 10); /* prevent buffer overflow */
423 y[10] = '\0'; /* fill to make sure string ends with '\0' */
424 printf("%5i, %5.3f, %10s, %10s\n", argc, x, y, argv[1]);
425 return 0;
426 }
427 EOF
428 $ gcc -Wall -g -o run_example example.c -lm
429 $ ./run_example
430 1, 2.915, ./run_exam, (null)
431 $ ./run_example 1234567890qwerty
432 2, 3.082, ./run_exam, 1234567890qwerty
433 --------------------
434
435 Here, "`-lm`" is needed to link library "`/usr/lib/libm.so`" from the `libc6` package for `sqrt`(3). The actual library is in "`/lib/`" with filename "`libm.so.6`", which is a symlink to "`libm-2.7.so`".
436
437 Look at the last parameter in the output text. There are more than 10 characters even though "`%10s`" is specified.
438
439 The use of pointer memory operation functions without boundary checks, such as `sprintf`(3) and `strcpy`(3), is deprecated to prevent buffer overflow exploits that leverage the above overrun effects. Instead, use `snprintf`(3) and `strncpy`(3).
440
441 === Debug
442
443 Debug is important part of programing activities. Knowing how to debug programs makes you a good Debian user who can produce meaningful bug reports.
444
445 ==== Basic gdb execution
446
447 Primary http://en.wikipedia.org/wiki/Debugger[debugger] on Debian is `gdb`(1) which enables you to inspect a program while it executes.
448
449 Let's install `gdb` and related programs by the following.
450
451 --------------------
452 # aptitude install gdb gdb-doc build-essential devscripts
453 --------------------
454
455 Good tutorial of `gdb` is provided by "`info gdb`" or found http://www.unknownroad.com/rtfm/gdbtut/gdbtoc.html[elsewhere on the web].
456 Here is a simple example of using `gdb`(1) on a "`program`" compiled with the "`-g`" option to produce debugging information.
457
458 --------------------
459 $ gdb program
460 (gdb) b 1 # set break point at line 1
461 (gdb) run args # run program with args
462 (gdb) next # next line
463 ...
464 (gdb) step # step forward
465 ...
466 (gdb) p parm # print parm
467 ...
468 (gdb) p parm=12 # set value to 12
469 ...
470 (gdb) quit
471 --------------------
472
473 TIP: Many `gdb`(1) commands can be abbreviated. Tab expansion works as in the shell.
474
475 ==== Debugging the Debian package
476
477 Since all installed binaries should be stripped on the Debian system by default, most debugging symbols are removed in the normal package. In order to debug Debian packages with `gdb`(1), corresponding `\*-dbg` packages need to be installed (e.g. `libc6-dbg` in the case of `libc6`).
478
479 If a package to be debugged does not provide its `\*-dbg` package, you need to install it after rebuilding it by the following.
480
481 --------------------
482 $ mkdir /path/new ; cd /path/new
483 $ sudo aptitude update
484 $ sudo aptitude dist-upgrade
485 $ sudo aptitude install fakeroot devscripts build-essential
486 $ sudo apt-get build-dep source_package_name
487 $ apt-get source package_name
488 $ cd package_name*
489 --------------------
490
491 Fix bugs if needed.
492
493 Bump package version to one which does not collide with official Debian versions, e.g. one appended with "`+debug1`" when recompiling existing package version, or one appended with "`\~pre1`" when compiling unreleased package version by the following.
494
495 --------------------
496 $ dch -i
497 --------------------
498
499 Compile and install packages with debug symbols by the following.
500
501 --------------------
502 $ export DEB_BUILD_OPTIONS=nostrip,noopt
503 $ debuild
504 $ cd ..
505 $ sudo debi package_name*.changes
506 --------------------
507
508 You need to check build scripts of the package and ensure to use "`CFLAGS=-g -Wall`" for compiling binaries.
509
510 ==== Obtaining backtrace
511
512 When you encounter program crash, reporting bug report with cut-and-pasted backtrace information is a good idea.
513
514 The backtrace can be obtained by the following steps.
515
516 - Run the program under `gdb`(1).
517 - Reproduce crash.
518 * It causes you to be dropped back to the `gdb` prompt.
519 - Type "`bt`" at the `gdb` prompt.
520
521 In case of program freeze, you can crash the program by pressing `Ctrl-C` in the terminal running `gdb` to obtain `gdb` prompt.
522
523 TIP: Often, you see a backtrace where one or more of the top lines are in "`malloc()`" or "`g_malloc()`". When this happens, chances are your backtrace isn\'t very useful. The easiest way to find some useful information is to set the environment variable "`$MALLOC_CHECK_`" to a value of 2 (`malloc`(3)). You can do this while running `gdb` by doing the following.
524
525 --------------------
526 $ MALLOC_CHECK_=2 gdb hello
527 --------------------
528
529 ==== Advanced gdb commands
530
531 .List of advanced gdb commands
532 [grid="all"]
533 `-----------------------------------`------------------------------------------------------------------------------
534 command description for command objectives
535 -------------------------------------------------------------------------------------------------------------------
536 `(gdb) thread apply all bt` get a backtrace for all threads for multi-threaded program
537 `(gdb) bt full` get parameters came on the stack of function calls
538 `(gdb) thread apply all bt full` get a backtrace and parameters as the combination of the preceding options
539 `(gdb) thread apply all bt full 10` get a backtrace and parameters for top 10 calls to cut off irrelevant output
540 `(gdb) set logging on` write log of `gdb` output to a file (the default is "`gdb.txt`")
541 -------------------------------------------------------------------------------------------------------------------
542
543 ==== Debugging X Errors
544
545 If a GNOME program `preview1` has received an X error, you should see a message as follows.
546
547 --------------------
548 The program 'preview1' received an X Window System error.
549 --------------------
550
551 If this is the case, you can try running the program with "`--sync`", and break on the "`gdk_x_error`" function in order to obtain a backtrace.
552
553 ==== Check dependency on libraries
554
555 Use `ldd`(1) to find out a program@@@sq@@@s dependency on libraries by the followings.
556
557 --------------------
558 $ ldd /bin/ls
559 librt.so.1 => /lib/librt.so.1 (0x4001e000)
560 libc.so.6 => /lib/libc.so.6 (0x40030000)
561 libpthread.so.0 => /lib/libpthread.so.0 (0x40153000)
562 /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
563 --------------------
564
565 For `ls`(1) to work in a `chroot`ed environment, the above libraries must be available in your `chroot`ed environment.
566
567 See <<_tracing_program_activities>>.
568
569 ==== Memory leak detection tools
570
571 There are several memory leak detection tools available in Debian.
572
573 .List of memory leak detection tools
574 [grid="all"]
575 `----------------`-------------`------------`----------------------------------------------------
576 package popcon size description
577 -------------------------------------------------------------------------------------------------
578 `libc6-dev` @-@popcon1@-@ @-@psize1@-@ `mtrace`(1): malloc debugging functionality in glibc
579 `valgrind` @-@popcon1@-@ @-@psize1@-@ memory debugger and profiler
580 `kmtrace` @-@popcon1@-@ @-@psize1@-@ KDE memory leak tracer using glibc@@@sq@@@s `mtrace`(1)
581 `alleyoop` @-@popcon1@-@ @-@psize1@-@ GNOME front-end to the Valgrind memory checker
582 `electric-fence` @-@popcon1@-@ @-@psize1@-@ `malloc`(3) debugger
583 `ccmalloc` @-@popcon1@-@ @-@psize1@-@ memory profiler/debugger
584 `leaktracer` @-@popcon1@-@ @-@psize1@-@ memory-leak tracer for C++ programs
585 `libdmalloc5` @-@popcon1@-@ @-@psize1@-@ debug memory allocation library
586 `mpatrolc2` @-@popcon1@-@ @-@psize1@-@ library for debugging memory allocations
587 -------------------------------------------------------------------------------------------------
588
589 ==== Static code analysis tools
590
591 There are http://en.wikipedia.org/wiki/Lint_programming_tool[lint] like tools for http://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis[static code analysis].
592
593 .List of tools for static code analysis
594 [grid="all"]
595 `---------------`-------------`------------`---------------------------------------------------------------------
596 package popcon size description
597 -----------------------------------------------------------------------------------------------------------------
598 `splint` @-@popcon1@-@ @-@psize1@-@ tool for statically checking C programs for bugs
599 `rats` @-@popcon1@-@ @-@psize1@-@ rough Auditing Tool for Security (C, C++, PHP, Perl, and Python code)
600 `flawfinder` @-@popcon1@-@ @-@psize1@-@ tool to examine C/C++ source code and looks for security weaknesses
601 `perl` @-@popcon1@-@ @-@psize1@-@ interpreter with internal static code checker: `B::Lint`(3perl)
602 `pylint` @-@popcon1@-@ @-@psize1@-@ Python code static checker
603 `jlint` @-@popcon1@-@ @-@psize1@-@ Java program checker
604 `weblint-perl` @-@popcon1@-@ @-@psize1@-@ syntax and minimal style checker for HTML
605 `linklint` @-@popcon1@-@ @-@psize1@-@ fast link checker and web site maintenance tool
606 `libxml2-utils` @-@popcon1@-@ @-@psize1@-@ utilities with `xmllint`(1) to validate XML files
607 -----------------------------------------------------------------------------------------------------------------
608
609 ==== Disassemble binary
610
611 You can disassemble binary code with `objdump`(1) by the following.
612
613 --------------------
614 $ objdump -m i386 -b binary -D /usr/lib/grub/x86_64-pc/stage1
615 --------------------
616
617 NOTE: `gdb`(1) may be used to disassemble code interactively.
618
619 === Flex -- a better Lex
620
621 http://en.wikipedia.org/wiki/Flex_lexical_analyser[Flex] is a http://en.wikipedia.org/wiki/Lex_programming_tool[Lex]-compatible fast http://en.wikipedia.org/wiki/Lexical_analysis[lexical analyzer] generator.
622
623 Tutorial for `flex`(1) can be found in "`info flex`".
624
625 You need to provide your own "`main()`" and "`yywrap()`". Otherwise, your flex program should look like this to compile without a library. This is because that "`yywrap`" is a macro and "`%option main`" turns on "`%option noyywrap`" implicitly.
626
627 --------------------
628 %option main
629 %%
630 .|\n ECHO ;
631 %%
632 --------------------
633
634 Alternatively, you may compile with the "`-lfl`" linker option at the end of your `cc`(1) command line (like AT&T-Lex with "`-ll`"). No "`%option`" is needed in this case.
635
636 === Bison -- a better Yacc
637
638 Several packages provide a http://en.wikipedia.org/wiki/Yacc[Yacc]-compatible lookahead http://en.wikipedia.org/wiki/LR_parser[LR parser] or http://en.wikipedia.org/wiki/LALR_parser[LALR parser] generator in Debian.
639
640 .List of Yacc-compatible LALR parser generators
641 [grid="all"]
642 `--------`-------------`------------`-----------------------------------------------------------------
643 package popcon size description
644 ------------------------------------------------------------------------------------------------------
645 `bison` @-@popcon1@-@ @-@psize1@-@ http://en.wikipedia.org/wiki/GNU_bison[GNU LALR parser generator]
646 `byacc` @-@popcon1@-@ @-@psize1@-@ Berkeley LALR parser generator
647 `btyacc` @-@popcon1@-@ @-@psize1@-@ backtracking parser generator based on `byacc`
648 ------------------------------------------------------------------------------------------------------
649
650 Tutorial for `bison`(1) can be found in "`info bison`".
651
652 You need to provide your own "`main()`" and "`yyerror()`". "`main()`" calls "`yyparse()`" which calls "`yylex()`", usually created with Flex.
653
654 --------------------
655 %%
656
657 %%
658 --------------------
659
660 === Autoconf
661
662 http://en.wikipedia.org/wiki/Autoconf[Autoconf] is a tool for producing shell scripts that automatically configure software source code packages to adapt to many kinds of Unix-like systems using the entire GNU build system.
663
664 `autoconf`(1) produces the configuration script "`configure`". "`configure`" automatically creates a customized "`Makefile`" using the "`Makefile.in`" template.
665
666 ==== Compile and install a program
667
668 WARNING: Do not overwrite system files with your compiled programs when installing them.
669
670 Debian does not touch files in "`/usr/local/`" or "`/opt`". So if you compile a program from source, install it into "`/usr/local/`" so it does not interfere with Debian.
671
672 --------------------
673 $ cd src
674 $ ./configure --prefix=/usr/local
675 $ make
676 $ make install # this puts the files in the system
677 --------------------
678
679 ==== Uninstall program
680
681 If you have the original source and if it uses `autoconf`(1)/`automake`(1) and if you can remember how you configured it, execute as follows to uninstall the program.
682
683 --------------------
684 $ ./configure "all-of-the-options-you-gave-it"
685 # make uninstall
686 --------------------
687
688 Alternatively, if you are absolutely sure that the install process puts files only under "`/usr/local/`" and there is nothing important there, you can erase all its contents by the following.
689
690 --------------------
691 # find /usr/local -type f -print0 | xargs -0 rm -f
692 --------------------
693
694 If you are not sure where files are installed, you should consider using `checkinstall`(8) from the `checkinstall` package, which provides a clean path for the uninstall. It now supports to create a Debian package with "`-D`" option.
695
696 === Perl short script madness
697
698 Although any http://en.wikipedia.org/wiki/AWK[AWK] scripts can be automatically rewritten in http://en.wikipedia.org/wiki/Perl[Perl] using `a2p`(1), one-liner AWK scripts are best converted to one-liner Perl scripts manually.
699
700 Let@@@sq@@@s think following AWK script snippet.
701
702 --------------------
703 awk '($2=="1957") { print $3 }' |
704 --------------------
705
706 This is equivalent to any one of the following lines.
707
708 --------------------
709 perl -ne '@f=split; if ($f[1] eq "1957") { print "$f[2]\n"}' |
710 --------------------
711
712 --------------------
713 perl -ne 'if ((@f=split)[1] eq "1957") { print "$f[2]\n"}' |
714 --------------------
715
716 --------------------
717 perl -ne '@f=split; print $f[2] if ( $f[1]==1957 )' |
718 --------------------
719
720 --------------------
721 perl -lane 'print $F[2] if $F[1] eq "1957"' |
722 --------------------
723
724 --------------------
725 perl -lane 'print$F[2]if$F[1]eq+1957' |
726 --------------------
727
728 The last one is a riddle. It took advantage of following Perl features.
729
730 - The whitespace is optional.
731 - The automatic conversion exists from number to the string.
732
733 See `perlrun`(1) for the command-line options. For more crazy Perl scripts, http://perlgolf.sourceforge.net[Perl Golf] may be interesting.
734
735 === Web
736
737 Basic interactive dynamic web pages can be made as follows.
738
739 - Queries are presented to the browser user using http://en.wikipedia.org/wiki/HTML[HTML] forms.
740 - Filling and clicking on the form entries sends one of the following http://en.wikipedia.org/wiki/Uniform_Resource_Locator[URL] string with encoded parameters from the browser to the web server.
741 * "`http://www.foo.dom/cgi-bin/program.pl?VAR1=VAL1&VAR2=VAL2&VAR3=VAL3`"
742 * "`http://www.foo.dom/cgi-bin/program.py?VAR1=VAL1&VAR2=VAL2&VAR3=VAL3`"
743 * "`http://www.foo.dom/program.php?VAR1=VAL1&VAR2=VAL2&VAR3=VAL3`"
744 - "`%nn`" in URL is replaced with a character with hexadecimal `nn` value.
745 - The environment variable is set as: "`QUERY_STRING="VAR1=VAL1 VAR2=VAL2 VAR3=VAL3"`".
746 - http://en.wikipedia.org/wiki/Common_Gateway_Interface[CGI] program (any one of "`program.\*`") on the web server executes itself with the environment variable "`$QUERY_STRING`".
747 - `stdout` of CGI program is sent to the web browser and is presented as an interactive dynamic web page.
748
749 For security reasons it is better not to hand craft new hacks for parsing CGI parameters. There are established modules for them in Perl and Python. http://en.wikipedia.org/wiki/PHP[PHP] comes with these functionalities. When client data storage is needed, http://en.wikipedia.org/wiki/HTTP_cookie[HTTP cookies] are used. When client side data processing is needed, http://en.wikipedia.org/wiki/JavaScript[Javascript] is frequently used.
750
751 For more, see http://hoohoo.ncsa.uiuc.edu/cgi/[The Common Gateway Interface], http://www.apache.org/[The Apache Software Foundation], and http://www.mozilla.org/js/[JavaScript].
752
753 Searching "CGI tutorial" on Google by typing encoded URL http://www.google.com/search?hl=en@@@amp@@@ie=UTF-8@@@amp@@@q=CGI+tutorial[http://www.google.com/search?hl=en@@@amp@@@ie=UTF-8@@@amp@@@q=CGI+tutorial] directly to the browser address is a good way to see the CGI script in action on the Google server.
754
755 === The source code translation
756
757 There are programs to convert source codes.
758
759 .List of source code translation tools
760 [grid="all"]
761 `-----------`-------------`------------`----------`------------------------------------------------------------------
762 package popcon size keyword description
763 ---------------------------------------------------------------------------------------------------------------------
764 `perl` @-@popcon1@-@ @-@psize1@-@ AWK->PERL convert source codes from AWK to PERL: `a2p`(1)
765 `f2c` @-@popcon1@-@ @-@psize1@-@ FORTRAN->C convert source codes from FORTRAN 77 to C/C++: `f2c`(1)
766 `protoize` @-@popcon1@-@ @-@psize1@-@ ANSI C create/remove ANSI prototypes from C code
767 `intel2gas` @-@popcon1@-@ @-@psize1@-@ intel->gas converter from NASM (intel format) to the GNU Assembler (GAS)
768 ---------------------------------------------------------------------------------------------------------------------
769
770 === Making Debian package
771
772 If you want to make a Debian package, read followings.
773
774 - <<_debian_package_management>> to understand the basic package system
775 - <<_porting_a_package_to_the_stable_system>> to understand basic porting process
776 - <<_chroot_system>> to understand basic chroot techniques
777 - `debuild`(1), `pbuilder`(1) and `pdebuild`(1)
778 - <<_debugging_the_debian_package>> for recompiling for debugging
779 - http://www.debian.org/doc/manuals/maint-guide/[Debian New Maintainers\' Guide] as tutorial (the `maint-guide` package)
780 - http://www.debian.org/doc/manuals/developers-reference/[Debian Developer@@@sq@@@s Reference] (the `developers-reference` package)
781 - http://www.debian.org/doc/debian-policy/[Debian Policy Manual] (the `debian-policy` package)
782
783 There are packages such as `dh-make`, `dh-make-perl`, etc., which help packaging.
784

  ViewVC Help
Powered by ViewVC 1.1.5