Guard against null _debugNames being used to build name strings.
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKBuffer.mm b/MoltenVK/MoltenVK/GPUObjects/MVKBuffer.mm
index db650c9..1e063c6 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKBuffer.mm
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKBuffer.mm
@@ -29,7 +29,8 @@
 #pragma mark MVKBuffer
 
 void MVKBuffer::propogateDebugName() {
-	if (_deviceMemory &&
+	if (_debugName &&
+		_deviceMemory &&
 		_deviceMemory->isDedicatedAllocation() &&
 		_deviceMemory->_debugName.length == 0) {
 
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.mm b/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.mm
index 173e96c..9136263 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.mm
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.mm
@@ -429,6 +429,9 @@
 	// Output
 	addFragmentOutputToPipeline(plDesc, reflectData, pCreateInfo);
 
+	// Metal does not allow the name of the pipeline to be changed after it has been created,
+	// and we need to create the Metal pipeline immediately to provide error feedback to app.
+	// The best we can do at this point is set the pipeline name from the layout.
 	setLabelIfNotNil(plDesc, ((MVKPipelineLayout*)pCreateInfo->layout)->getDebugName());
 
 	return plDesc;
@@ -580,6 +583,9 @@
 	}
 	plDesc.stageInputDescriptor.indexBufferIndex = kMVKTessCtlIndexBufferIndex;
 
+	// Metal does not allow the name of the pipeline to be changed after it has been created,
+	// and we need to create the Metal pipeline immediately to provide error feedback to app.
+	// The best we can do at this point is set the pipeline name from the layout.
 	setLabelIfNotNil(plDesc, ((MVKPipelineLayout*)pCreateInfo->layout)->getDebugName());
 
 	return plDesc;
@@ -1172,6 +1178,10 @@
 	if (shaderFunc.mtlFunction) {
 		MTLComputePipelineDescriptor* plDesc = [[MTLComputePipelineDescriptor new] autorelease];
 		plDesc.computeFunction = shaderFunc.mtlFunction;
+
+		// Metal does not allow the name of the pipeline to be changed after it has been created,
+		// and we need to create the Metal pipeline immediately to provide error feedback to app.
+		// The best we can do at this point is set the pipeline name from the layout.
 		setLabelIfNotNil(plDesc, ((MVKPipelineLayout*)pCreateInfo->layout)->getDebugName());
 
 		MVKComputePipelineCompiler* plc = new MVKComputePipelineCompiler(this);
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKSwapchain.mm b/MoltenVK/MoltenVK/GPUObjects/MVKSwapchain.mm
index 47c711b..42a3b8b 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKSwapchain.mm
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKSwapchain.mm
@@ -35,9 +35,11 @@
 #pragma mark MVKSwapchain
 
 void MVKSwapchain::propogateDebugName() {
-	size_t imgCnt = _surfaceImages.size();
-	for (size_t imgIdx = 0; imgIdx < imgCnt; imgIdx++) {
-		_surfaceImages[imgIdx]->setDebugName([NSString stringWithFormat: @"%@(%lu)", _debugName, imgIdx].UTF8String);
+	if (_debugName) {
+		size_t imgCnt = _surfaceImages.size();
+		for (size_t imgIdx = 0; imgIdx < imgCnt; imgIdx++) {
+			_surfaceImages[imgIdx]->setDebugName([NSString stringWithFormat: @"%@(%lu)", _debugName, imgIdx].UTF8String);
+		}
 	}
 }
 
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKVulkanAPIObject.mm b/MoltenVK/MoltenVK/GPUObjects/MVKVulkanAPIObject.mm
index 8815dab..0c5c10e 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKVulkanAPIObject.mm
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKVulkanAPIObject.mm
@@ -55,9 +55,11 @@
 }
 
 VkResult MVKVulkanAPIObject::setDebugName(const char* pObjectName) {
-	[_debugName release];
-	_debugName = [[NSString stringWithUTF8String: pObjectName] retain];		// retained
-	propogateDebugName();
+	if (pObjectName) {
+		[_debugName release];
+		_debugName = [[NSString stringWithUTF8String: pObjectName] retain];		// retained
+		propogateDebugName();
+	}
 	return VK_SUCCESS;
 }