Charlton recorded only their second Premiership win of the season, thanks to Darren Bent's goal and goalkeeper Scott Carson's outstanding display.
Bent celebrates an important goal for Charlton
Bent connected with Jerome Thomas' exquisite cross to send a deft glancing header into the bottom corner.
Then a combination of superb keeping from Carson, and a large portion of luck, helped Charlton keep out City.
Carson made breathtaking stops to deny Georgios Samaras and Bernardo Corradi, while Hatem Trabelsi hit the post.
But Charlton were not without chances of their own, with Andy Reid and Bent causing the City defence numerous problems.
Late in the second half, Bent could have doubled the hosts' advantage but sliced his volley wide.
And in the dying stages, Bent provided the perfect cross for substitute Jimmy Floyd Hasselbaink to seal victory, but his diving header drifted wide.
Earlier, Reid was impressive in the first half, frequently going on mazy runs and whipping in a couple of teasing crosses.
And in an open game, City also had plenty of chances to get in the scoresheet - only Carson's excellence and some misfortune prevented it.
Micah Richards will feel particularly hard done by after he twice went close with headers.
The first, on 26 minutes, looked to be sneaking in at the near post but was deflected round the post by the legs of Thomas, who was in mid-air at the time and likely knew little about it.
Richards almost brought City level 30 minutes later, but again he saw his header blocked by legs - this time it was Carson who stretched out to divert the effort.
In between those chances, Bent had nodded Charlton ahead - just at the time when they had been under most pressure.
And they held that lead with some dogged defending - and a heroic display from Carson.
He dived full length to palm away a stinging Georgios Samaras volley at the end of the first half, and was equally impressive when he turned away Corradi's second-half header.
City came agonising close to levelling in the final seconds when Trevor Sinclair's shot almost fell to Darius Vassell.
It was one of those days for City, who probably would not have scored had the goals been the size of a county.
And if they had equalised it would have been harsh on Charlton - and Carson in particular.
Charlton manager Iain Dowie:
"We played well for 70 minutes and caused them no end of problems but when we started sniffing the victory we invited pressure on ourselves.
"Luckily we got through it and it is a big relief. After the good result at Newcastle last week we needed to reaffirm things and I think we did.
"This result is a big boost for us and I am very pleased."
Manchester City boss Stuart Pearce:
"We're disappointed to come away with nothing again but we need to convert our chances and get our noses in front on the road.
"If we had done that today we would probably have won comfortably but to be fair Charlton defended well.
"It was typical of our luck when Hatem Trabelsi's shot hit the inside of a post and bounced to the keeper."
Charlton: Carson, Young, El Karkouri, Diawara, Hreidarsson, Rommedahl (Hughes 46), Faye, Holland, Reid (Hasselbaink 87), Thomas, Darren Bent.
Subs Not Used: Andersen, Kishishev, Marcus Bent.
Booked: El Karkouri.
Goals: Darren Bent 28.
Man City: Weaver, Richards, Dunne, Distin, Thatcher, Sinclair, Barton, Reyna, Beasley (Vassell 50), Dickov (Corradi 63), Samaras (Trabelsi 63).
Subs Not Used: Hart, Johnson. Booked: Thatcher, Vassell.
Ref: C Foy (Merseyside).