The model which handles the saving of the information entered in the billing section during checkout can be located at app/code/core/Mage/Checkout/Model/Type/Onepage.php
.
You're looking for a public function named saveBilling($data, $customerAddressId)
.
During this step of checkout, Magento stores the information populated by the customer inside the quote object. In Magento 1.9.x, you'll see around line 306 of the Model file:
$address->setSaveInAddressBook(empty($data['save_in_address_book']) ? 0 : 1);
Which in turns stores the address information to the database.
You mention in your question that the information submitted seems to be empty, which is likely being caught right as the function commences:
if (empty($data)) {
return array('error' => -1, 'message' => Mage::helper('checkout')->__('Invalid data.'));
}
The data being submitted is somehow corrupted (this could be due to a JS error, third party extension etc.). I'd suggest disabling any third party extensions which interfere with the checkout process, one-by-one, to identify the culprit.
It would also be useful to check whether any JS errors are occurring on the page, which you can identify using the dev tools feature of whichever browser you are using.