Archive for the 'Programming' Category

How to fix that mistake commit you just pushed to your git repository

I've already written a time or two how you can use git rebase to change your commit history as you work. Handy handy.. I think everyone should know how to do that.

Next up.. what if you pushed a commit and realize it's not so great. First of all, everyone discourages this of course. The encouraged way is to just make another commit that fixes what you want different. We all want to break that rule every now and then though. Here's how...
Continue reading 'How to fix that mistake commit you just pushed to your git repository'

Pulling libraries off Android phones

Well, have you ever wanted to pull a bunch of libraries off an Android phone? I bet you wish you could execute the command like this:

  2. > adb pull /system/lib/*.so

Sorry. A no go. What about this then:

  2. > for file in `adb ls /system/lib/`; do adb pull /system/lib/$file; done

Well, almost, but adb ls attaches the \n\r to the files. That wouldn't be a problem if adb pull didn't attach them to the names, so you have to get rid of the white space. This can work:

  2. > for file in `adb ls /system/lib`; do adb pull `echo /system/lib/$file | tr -d '\n\r'`; done

Yea. Enjoy.

YUI Image Uploader works with YUI 2.8.1

I thought I'd better double check that the image upload still works fine with YUI 2.8.1 If you haven't read the original YUI Image Uploader page, start there. After that, you can use this page for an example getting the script to work with the latest YUI.

Continue reading 'YUI Image Uploader works with YUI 2.8.1'

Debugging Linux Kernel Modules with VirtualBox and KGDB

I found a few different pages with information on debugging a Linux kernel with kgdb. There wasn't a single source with all the information I needed to get set up and working though. So here is how I set things up on my Linux host machine to debug a target Linux kernel running in a VirtualBox VM.

  1. Set up the virtual machine

    When setting up the VM, add a serial port and set it to use Host Pipe. You can check the box to have VirtualBox create the pipe too. Give a path to the file on the host where you want the pipe. This will become the virtual serial console that gdb connects to on the host machine.

    Install VirtualBox with a VM containing the kernel you want to debug. Build the kernel with debug symbols, kgdb support, sysrq keys

    2. Kernel hacking->
    3. [*] Magic SysRq Key
    4. [*] Kernel debugging
    5. [*] Compile the kernel with debug info
    6. [*] KGDB: kernel debugging with remote gdb ->
    7. [*] KGDB: use kgdb over the serial console

    Build your kernel and install the modules like you would any other kernel.

    Add kgdboc=ttyS0,115200 to the kernel paremeters (ttyS[0-3] depending on which COM port you choose in the VM setup.)

    Copy the vmlinux (uncompressed version to the host machine).
    Also copy the .ko for the module you want to debug.

    Start VM.

  2. Get the target VM ready for debugging

    After your module is inserted, you need its .text address so that you can see the source lines in gdb.

    2. cat /sys/module/XXX/sections/.text
    3. 0xffffffffa00c0000

    When you're ready to start a debug session:

    2. echo g > /proc/sysrq-trigger
  3. Ready the Host to connect to the VM

  4. You need to convert the pipe that VirtualBox created to a serial port like object. socat does that job:

    2. > socat -d -d /path/to/pipe pty &
    3. 2010/04/29 12:18:44 socat[4411] N successfully connected from local address AF=1 "\0\0\0\0\0\0\0\0\0\x02\0\0\0\0[\0\0\0|\0\0\0w"
    4. 2010/04/29 12:18:44 socat[4411] N successfully connected via C\xE66
    5. 2010/04/29 12:18:44 socat[4411] N PTY is /dev/pts/3
    6. 2010/04/29 12:18:44 socat[4411] N starting data transfer loop with FDs [3,3] and [4,4]

    Notice that your dev is pts/3.

    Now we make a .gdbinit file so you can start gdb without typing the commands every time.

    2. file vmlinux
    3. set remotebaud 115200
    4. target remote /dev/pts/3

    You'll change your pts setting to whatever is relevant.

    start gdb.

    On the target, when you send the g to sysrq-trigger, you should drop to a breakpoint in gdb.

    Next job is to load the module symbols.

    2. > add-symbol-file <path to module> <.text address>
    3. > b some_file.c:NNN
    4. > c

    Now you can set breakpoints or press c to continue. The target should continue until it comes to a breakpoint or encounters an error.

A last tidbit, when I wanted to close gdb on the host, use detach instead of quit.

Happy debugging! backend implementation of YUI Image Uploader

Tom from has created an ASP YUI Image Uploader backend. Direct Download:

The YUI Image Upload posts on this site contain details on implementing the front end and editor if you're just getting into this.

Thanks Tom.

git logk

Do you like gitk? I find it almost invaluable in merging, branching, looking at old revisions, diffs, etc. I find it annoying that git log is hard to glean the same information. I searched a round a bit and found that git log is quite configurable as to what it outputs. Here is a simple alias that outputs the log with some of the data you'd find by viewing gitk.

  2. git config alias.logk 'log --graph --pretty=format:"%h %ae: %s" --decorate --abbrev-commit'

You can add --global so you don't have to make a logk alias for every repository.
You can also read the man page for "git log" and change the format to suite your liking.