login
Header Space

 
 

Re: Real-life kernel debugging scenario

Score:
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
To: walt <wa1ter@...>
Cc: <git@...>
Date: Monday, November 7, 2005 - 9:31 pm

On Mon, 7 Nov 2005, walt wrote:

No. This is what "git bisect" is there for.

It works wonderfully well. To the point where I don't even try to be smart 
about things: I've had two cases in the last month of merges that caused 
problems for me, and instead of even trying to guess which patch it was, I 
just bisected it.


First, try "git bisect". It doesn't depend on backing out individual 
commits, instead it starts a special "bisect" branch, and (as the name 
implies) does a binary search within that branch to figure out what is 
wrong.

The way to use "git bisect" couldn't be easier.

Figure out what the oldest bad state you know about is (that's usually the 
head of "master", since that's what you just tried to boot and failed at). 
Also, figure out the most recent known-good commit (usually the _previous_ 
kernel you ran: and if you've only done a single "pull" in between, it 
will be ORIG_HEAD).

Then do

	git bisect start
	git bisect bad master		<- mark "master" as the bad state
	git bisect good ORIG_HEAD	<- mark ORIG_HEAD as good (or
					   whatever other known-good 
					   thing you booted laste)

and at this point "git bisect" will churn for a while, and tell you what 
the mid-point between those two commits are, and check that state out as 
the head of the bew "bisect" branch.

Compile and reboot.

If it's good, just do

	git bisect good		<- mark current head as good

otherwise, reboot into a good kernel instead, and do (surprise surprise, 
git really is very intuitive):

	git bisect bad		<- mark current head as bad

and whatever you do, git will select a new half-way point. Do this for a 
while, until git tells you exactly which commit was the first bad commit. 
That's your culprit.

It really works wonderfully well, except for the case where there was 
_another_ commit that broke something in between, like introduced some 
stupid compile error. In that case you should not mark that commit good or 
bad: you should try to find another commit close-by, and do a "git reset 
--hard <newcommit>" to try out _that_ commit instead, and then test that 
instead (and mark it good or bad).

You can do "git bisect visualize" while you do all this to see what's 
going on by starting up gitk on the bisection range.

Finally, once you've figured out exactly which commit was bad, you can 
then go back to the master branch, and try reverting just that commit:

	git checkout master
	git revert <bad-commit-id>

to verify that the top-of-kernel works with that single commit reverted.

		Linus
-
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
Real-life kernel debugging scenario, walt, (Mon Nov 7, 8:51 pm)
Re: Real-life kernel debugging scenario, Linus Torvalds, (Mon Nov 7, 9:31 pm)
Re: Real-life kernel debugging scenario, Linus Torvalds, (Wed Nov 9, 2:36 pm)
Re: Real-life kernel debugging scenario, Jon Loeliger, (Wed Nov 9, 2:17 pm)
Re: Real-life kernel debugging scenario, Junio C Hamano, (Mon Nov 7, 9:30 pm)
Re: Real-life kernel debugging scenario, David Lang, (Mon Nov 7, 8:59 pm)
speck-geostationary